可嵌入对比一对多

时间:2017-05-17 06:49:32

标签: sql database oracle database-design

我在Dzone看过一篇关于邮政和邮政详情(两个不同实体)及其关系的文章。帖子及其细节在不同的表格中。但是正如我所看到的,Post Detail是一个可嵌入的部分,因为它不能在没有“父”帖子的情况下使用。那么在另一个表中将它分开的逻辑是什么?

请告诉我何时使用哪一个?

1 个答案:

答案 0 :(得分:1)

可嵌入类表示其父类的状态。因此,举个例子,StackOverflow POST有一个不变的ID,并在一个牢不可破的URL中用于共享,例如http://stackoverflow.com/q/44017535/146325。还有一系列其他属性(状态,投票等)是标量属性。当帖子被编辑时,我们有各种版本的文本(对于具有足够代表的人来说,这些版本是保持和可见的)。那些是你的POST DETAILS。

  

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

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

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

  1. 使用嵌套表的SQL非常笨拙。例如,要获取POST及其文本的最新版本,每次我们需要显示时都需要取消的详细信息集合。计算上与加入子表并过滤最新版本标志没有太大区别,但更难以优化。
  2. 孩子们可以自己生孩子。对于帖子,标签是细节,因为它们可能因编辑而有所不同。但是如果你在POST中嵌入了POST中的TAG,那么找到所有带[oracle]标签的帖子有多容易?
  3. 这是面向对象设计和关系设计之间的区别。

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

    关系优先考虑共性:同一类型的所有东西都与其他东西的链接组合在一起。这种方法适用于处理各种事物,因此适用于数据管理任务(您是否希望找到所有在BERLIN工作或其工作是工程师或由ELLIOTT管理的员工?)

      

    “给我一个更明确的解释,何时使用哪一个”

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