数据库设计 - 应该避免一对一的关系吗?

时间:2010-10-15 04:56:19

标签: database database-design orm

  

可能重复:
  Is there ever a time where using a database 1:1 relationship makes sense?

为了简单起见,我会直截了当地提出这个问题:是否应避免数据库设计中的一对一关系或这是否可以接受?

我知道这个“item”的所有属性都可以托管在一个表中,但我觉得在通过ORM将我的数据库设计转换为业务对象时,它会使实体与不必要的属性混乱。

通过UI,希望这将描绘出更好的画面,我有一个包含所有必要属性的主窗体。我将有一个允许用户点击它的按钮,它将显示一个新表单以附加额外的属性。主表单(实体)不得超过1个条目,即它是0..1结束关系。

任何建议都将受到赞赏。

5 个答案:

答案 0 :(得分:43)

不,1:1的关系完全有道理。

想象一个实体可选地拥有一个充满属性的存储桶 - 您的某些实体拥有这些属性,而其他实体则没有。

您可以将所有这些属性作为列包含在实体表中 - 但在这种情况下,对于大量条目,许多列最终会为空。

或者:您可以将这些“可选”属性放入单独的表中,与基本实体表建立1:1(或者更确切地说:0:1 )关系,并且只存储东西如果您的实体确实具有这些属性,那就在那里。

决定是否将某些属性“外包”到一个单独的表中的主要标准是:

  • 这涉及多少属性?如果它只是一两个 - 不要花时间将它们放在单独的表中。但如果你在谈论8,10,15 - 那就考虑一下

  • 有多少基础实体可能拥有这些可选属性?再说一次:如果95%的所有实体总是拥有所有这些属性,那么执行这个额外步骤是没有意义的。如果您的实体中只有一半或更少具有这些属性 - >我肯定会考虑这样一张表

答案 1 :(得分:5)

我会避免一对一。如果没有技术需求,就没有意义。您只是为db和额外的表和索引创建额外的连接以进行管理。另外,仅仅因为你的表具有所有字段并不意味着你的对象必须。

答案 2 :(得分:5)

取决于应用程序要求

通常情况下,我会说一对一的关系被建模为表中的列,但是这种限制太多的情况:

  1. 您的架构经常更改,应用程序可以自定义对象的属性
  2. 性能不是问题,您使用视图为抽象后端属性存储创建数据布局
  3. 我见过表格,其中1-> 1关系在垂直分片中的表格和具有较高索引要求的数据库中分开。

    除非你的应用程序需要,否则你可以分割和抽象到你最终得到Entity-attribute-value structure行的东西......这并不总是你想要的(增加了复杂性,性能)。正如marc_s所说,你想尽可能避免这种情况。

答案 3 :(得分:5)

有两种情况可能有意义:

  • 可以与主要实体关联的可选属性块,这使其成为1:[0-1]关系。在执行对象/关系映射时,这也可用于表示子类的字段。
  • 性能非规范化,当作为物理设计的一部分完成时。如果很少需要其他属性,可以将它们分流到一个单独的表中,如果需要可以将其加入。但是,如果您的数据库可以使用covering indexmaterialized view进行优化来创建频繁访问的数据子集的物理表示,则可能不需要此技术。

答案 4 :(得分:1)

如果所有项目都具有所有属性,那么拥有一个表通常是有意义的。

如果某些项目只有一些属性,那么有多个表格是有意义的。

为了提高ORM的效率,像延迟属性获取这样的东西可能会派上用场。事情是,它仍然相当罕见;除非你真的认为这是一个问题,否则不要担心优化。根据定义,过早优化不是花费时间的有效场所。