可能重复:
Is there ever a time where using a database 1:1 relationship makes sense?
为了简单起见,我会直截了当地提出这个问题:是否应避免数据库设计中的一对一关系或这是否可以接受?
我知道这个“item”的所有属性都可以托管在一个表中,但我觉得在通过ORM将我的数据库设计转换为业务对象时,它会使实体与不必要的属性混乱。
通过UI,希望这将描绘出更好的画面,我有一个包含所有必要属性的主窗体。我将有一个允许用户点击它的按钮,它将显示一个新表单以附加额外的属性。主表单(实体)不得超过1个条目,即它是0..1结束关系。
任何建议都将受到赞赏。
答案 0 :(得分:43)
不,1:1的关系完全有道理。
想象一个实体可选地拥有一个充满属性的存储桶 - 您的某些实体拥有这些属性,而其他实体则没有。
您可以将所有这些属性作为列包含在实体表中 - 但在这种情况下,对于大量条目,许多列最终会为空。
或者:您可以将这些“可选”属性放入单独的表中,与基本实体表建立1:1(或者更确切地说:0:1 )关系,并且只存储东西如果您的实体确实具有这些属性,那就在那里。
决定是否将某些属性“外包”到一个单独的表中的主要标准是:
这涉及多少属性?如果它只是一两个 - 不要花时间将它们放在单独的表中。但如果你在谈论8,10,15 - 那就考虑一下
有多少基础实体可能拥有这些可选属性?再说一次:如果95%的所有实体总是拥有所有这些属性,那么执行这个额外步骤是没有意义的。如果您的实体中只有一半或更少具有这些属性 - >我肯定会考虑这样一张表
答案 1 :(得分:5)
我会避免一对一。如果没有技术需求,就没有意义。您只是为db和额外的表和索引创建额外的连接以进行管理。另外,仅仅因为你的表具有所有字段并不意味着你的对象必须。
答案 2 :(得分:5)
取决于应用程序要求
通常情况下,我会说一对一的关系被建模为表中的列,但是这种限制太多的情况:
我见过表格,其中1-> 1关系在垂直分片中的表格和具有较高索引要求的数据库中分开。
除非你的应用程序需要,否则你可以分割和抽象到你最终得到Entity-attribute-value structure行的东西......这并不总是你想要的(增加了复杂性,性能)。正如marc_s所说,你想尽可能避免这种情况。
答案 3 :(得分:5)
有两种情况可能有意义:
答案 4 :(得分:1)
如果所有项目都具有所有属性,那么拥有一个表通常是有意义的。
如果某些项目只有一些属性,那么有多个表格是有意义的。
为了提高ORM的效率,像延迟属性获取这样的东西可能会派上用场。事情是,它仍然相当罕见;除非你真的认为这是一个问题,否则不要担心优化。根据定义,过早优化不是花费时间的有效场所。