可嵌入与一对多

Posted

技术标签:

【中文标题】可嵌入与一对多【英文标题】:Embeddable vs one to many 【发布时间】:2017-10-16 11:37:16 【问题描述】:

我在 Dzone 中看到一篇关于 Post 和 Post Details(两个不同的实体)以及它们之间的关系的文章。那里的帖子及其详细信息在不同的表格中。但正如我所见,帖子详细信息是一个可嵌入的部分,因为没有“父”帖子就无法使用它。那么在另一个表中分隔它的逻辑是什么?

请给我一个更清楚的解释什么时候使用哪个?

【问题讨论】:

你能在这里提供更多的上下文吗?事实上,可能不需要两张表,但做出这个决定可能是有正当理由的,这显示一些数据可能会解释。 请添加帖子链接 在数据是一点信息的情况下,将结构化数据与其父行一起存储可能是一个不错的概念。在this link,我回答了我什么时候应该按原样保存JSON这个问题并不完全相同,但非常相关。可能很有趣…… 【参考方案1】:

可嵌入类表示其父类的状态。因此,以您为例,*** POST 具有一个不变的 ID,并用于不可破坏的 URL 以进行共享,例如http://***.com/q/44017535/146325。还有一系列其他属性(状态、投票等)是标量属性。当帖子被编辑时,我们有各种版本的文本(保留并可供有足够代表的人看到)。这些是您的帖子详细信息。

“在另一个表中分隔它的逻辑是什么?”

因为在不同的表中保存不同的东西是关系数据库所做的。表示此数据模型的标准方式是父表 POST 和子表 POST_DETAIL 具有通过外键强制执行的定义关系。

可嵌入是来自面向对象编程的概念。 Oracle 确实支持数据库中的对象关系结构。因此可以定义一个 POST_DETAIL 类型并创建一个 POST 表,该表的列声明为该类型的嵌套表。但是,这将是一个糟糕的设计,原因有两个:

    用于处理嵌套表的 SQL 很笨拙。例如,要获取 POST 及其文本的最新版本,每次我们需要显示它时都需要取消嵌套详细信息的集合。在计算上与加入子表和过滤最新版本标志没有太大区别,但更难优化。 孩子可以自己生孩子。在帖子的情况下,标签是详细信息,因为它们可能会因编辑而有所不同。但是,如果您在 POST_DETAIL 中嵌入 TAG 嵌入在 POST 中,那么找到所有带有 [oracle] 标签的帖子有多容易?

这是面向对象设计和关系设计之间的区别。

OO 具有很强的层次性:一切都属于某物,获取细节的方式是通过父级。这种方法在处理事物的单个实例时效果很好,因此适用于 UI 设计。

关系优先考虑共性:同一类型的所有事物都通过与其他事物的链接组合在一起。这种方法适用于处理多组事物,因此适用于数据管理任务(您想查找所有在柏林工作或工作是工程师或由 ELLIOTT 管理的员工吗?)

“给我一个更清楚的解释什么时候使用哪个”

始终将数据以相关方式存储在单独的表中。在有意义的情况下使用 OO 模式构建 API。

【讨论】:

只是一个迂腐的小问题。 “关系”实际上并不优先考虑关系。 FK 关系是一个笨拙的工作回合。 RDBMS 中的“关系”指的是特定表中的所有行都是相关的,因为它们是同一类型的事物,而不是它们与其他表中的其他行相关。除此之外 - 很好的答案。 @BriteSponge - 感谢您的反馈。我急于完成这篇文章,但没有正确阅读。

以上是关于可嵌入与一对多的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2 使用一对多数据库关系的嵌入式表单

MyBatis3一对一,一对多

更新一对多关系后删除孤儿

涉及新实体和一对多关系的核心数据迁移

数据库一对一对多多对多关系

mybatis之一对多