域模型包含一组对象。我在这里介绍一个附带项目,但是我有一个更复杂的工作项目,因为我没有很好地分离数据库和域。
在本例中,该对象称为CyclingRecord。
遵循洋葱建筑,域对象对它们的持久性一无所知。但是,这些对象中的每一个都对应于数据存储中的条目(可能是数据库,可能是文件)。行ID绝对不是域对象的一部分,因此不需要存储在域对象中。
data CyclingRecord = CyclingRecord { date :: Day,
distance :: Float,
time :: Integer,
description :: Maybe String }在一种强不可变的语言(如Haskell和Clojure)中,身份和价值是同义词。此外,没有理由你不能记录超过一天的一次骑行。所以,整个记录完全描述了一段旅程。
因此,如果我在域中编辑记录,当我将已编辑的对象传回数据库基础设施时,如何通知数据库它需要更新特定的记录,而不是删除现有的记录?
(同样的想法需要是可扩展的,这样我就可以让一个应用程序一次操作多条记录,然后将它们全部发送回数据库。离线操作或同步或只是避免过多的磁盘活动)
除非正确的答案是为每一次骑行做一些类似于唯一标识符的事情。也许是个UUID。也许在记录中添加一个“日计数器”。让它本质上是骑自行车的一部分,然后让数据库依赖于它,而不是单独的行ID。
发布于 2012-05-01 18:57:11
正确的答案是为每一次骑行制作一个类似于唯一标识符的东西。实体需要标识,在这种情况下,标识实际上与日期、距离、时间和描述的组合是分开的。你是说这些东西可以改变,而身份却不能改变。
所以,给他们一些不变的东西--一个UUID,如果你愿意的话。
发布于 2012-05-01 18:58:03
看起来你的时间戳应该是唯一的,为什么不用它作为你的主键呢?在持久化逻辑中,您可以预先删除(始终删除具有相同时间戳的任何记录,然后插入),也可以检查记录是否已经存在,并酌情插入或更新。
或者,您可以使用某种修饰器或辅助对象来保存持久化元数据。您的持久性逻辑必须有一些方法来将元数据与循环记录相匹配,并在持久化记录时创建或更新它。
如果您确定您确实需要一个唯一的ID,为什么不指定一个“乘车号码”呢?这听起来很有道理。它可以是一个顺序编号,也可以是从时间戳中产生的(例如,"201205011045“,供您在2012年5月1日10:45乘车时使用)。
发布于 2012-05-01 19:24:13
如果数据库具有唯一标识符,则没有理由不将其作为域模型的一部分。即使它没有任何其他含义(例如雇员编号、用户名、电子邮件地址、汽车VIN等)。
否则,您必须依赖于其他字段的组合,或者依赖于每个对象,以便在现实世界中为其分配一些唯一的编号。
这是更新或删除数据的关键(理论上,您可以像用户在搜索表单中一样,通过任意数量的字段选择记录。)不可变对象在更新时没有这个问题。
https://softwareengineering.stackexchange.com/questions/146765
复制相似问题