首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将内存中的域对象链接到其数据库记录,而不将域与数据库关系混淆?

如何将内存中的域对象链接到其数据库记录,而不将域与数据库关系混淆?
EN

Software Engineering用户
提问于 2012-05-01 17:54:57
回答 4查看 473关注 0票数 7

域模型包含一组对象。我在这里介绍一个附带项目,但是我有一个更复杂的工作项目,因为我没有很好地分离数据库和域。

在本例中,该对象称为CyclingRecord。

遵循洋葱建筑,域对象对它们的持久性一无所知。但是,这些对象中的每一个都对应于数据存储中的条目(可能是数据库,可能是文件)。行ID绝对不是域对象的一部分,因此不需要存储在域对象中。

代码语言:javascript
复制
data CyclingRecord = CyclingRecord { date :: Day,
                                     distance :: Float,
                                     time :: Integer,
                                     description :: Maybe String }

在一种强不可变的语言(如Haskell和Clojure)中,身份和价值是同义词。此外,没有理由你不能记录超过一天的一次骑行。所以,整个记录完全描述了一段旅程。

因此,如果我在域中编辑记录,当我将已编辑的对象传回数据库基础设施时,如何通知数据库它需要更新特定的记录,而不是删除现有的记录?

(同样的想法需要是可扩展的,这样我就可以让一个应用程序一次操作多条记录,然后将它们全部发送回数据库。离线操作或同步或只是避免过多的磁盘活动)

除非正确的答案是为每一次骑行做一些类似于唯一标识符的事情。也许是个UUID。也许在记录中添加一个“日计数器”。让它本质上是骑自行车的一部分,然后让数据库依赖于它,而不是单独的行ID。

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2012-05-01 18:57:11

正确的答案是为每一次骑行制作一个类似于唯一标识符的东西。实体需要标识,在这种情况下,标识实际上与日期、距离、时间和描述的组合是分开的。你是说这些东西可以改变,而身份却不能改变。

所以,给他们一些不变的东西--一个UUID,如果你愿意的话。

票数 2
EN

Software Engineering用户

发布于 2012-05-01 18:58:03

看起来你的时间戳应该是唯一的,为什么不用它作为你的主键呢?在持久化逻辑中,您可以预先删除(始终删除具有相同时间戳的任何记录,然后插入),也可以检查记录是否已经存在,并酌情插入或更新。

或者,您可以使用某种修饰器或辅助对象来保存持久化元数据。您的持久性逻辑必须有一些方法来将元数据与循环记录相匹配,并在持久化记录时创建或更新它。

如果您确定您确实需要一个唯一的ID,为什么不指定一个“乘车号码”呢?这听起来很有道理。它可以是一个顺序编号,也可以是从时间戳中产生的(例如,"201205011045“,供您在2012年5月1日10:45乘车时使用)。

票数 1
EN

Software Engineering用户

发布于 2012-05-01 19:24:13

如果数据库具有唯一标识符,则没有理由不将其作为域模型的一部分。即使它没有任何其他含义(例如雇员编号、用户名、电子邮件地址、汽车VIN等)。

否则,您必须依赖于其他字段的组合,或者依赖于每个对象,以便在现实世界中为其分配一些唯一的编号。

这是更新或删除数据的关键(理论上,您可以像用户在搜索表单中一样,通过任意数量的字段选择记录。)不可变对象在更新时没有这个问题。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/146765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档