【问题标题】:Database tables; spread them out, or null them together?数据库表;将它们分散开来,还是将它们一起归零?
【发布时间】:2011-07-25 05:55:37
【问题描述】:

关于数据库设计的快速问题;

鉴于我将User 数据存储在数据库中,我可以识别(看似)与用户关联的两种不同形式的数据; 帐户数据个人资料数据

大多数个人资料数据是可选的,并且是不必要的(可以,而且通常是NULL),而帐户数据是用户不可或缺的,他们使用服务的能力(很少或没有记录可以/将是NULL)

将其拆分为两个表作为1-to-1 有什么好处吗?仅从设计的角度来看,这似乎是合乎逻辑的,但在谈论性能时,这是一种常见的()实践吗?

【问题讨论】:

    标签: sql database database-design ddl multiple-tables


    【解决方案1】:

    从逻辑设计的角度来看,实体类型是由它所具有的属性定义的。每组独特的属性都定义了不同的东西,并且应该放在自己的表中,除非您有充分的理由不这样做。使用范式和正交设计原则等设计原则来验证哪些属性属于哪个表。

    这样做的好处是您不需要为不存在的属性值创建空值或虚拟值。以这种方式使用空值几乎不可避免地会导致错误、模棱两可的结果和日后的妥协。

    【讨论】:

      【解决方案2】:

      我认为为个人资料和帐户数据制作单独的表格是常见的良好做法。我已经多次看到并使用过这种风格。

      【讨论】:

      • 谢谢@i_forget - 优势在哪里?例如;如果创建了用户,则会在AccountProfile 表中创建一行;不同之处在于,由于只需要 Account 数据(并且可以稍后添加 Profile 数据Account 行填充了数据,而 Profile 行只是一个NULL 值的集合。 Profile 行是否应该在将数据推入之前保持未创建状态,以避免可能永久保留NULL'ed 的行?
      • 您不会创建个人资料日期条目,直到用户添加一些内容并且您可以轻松判断谁/多少人拥有个人资料数据。您可以在不影响关键帐户表的情况下添加更多配置文件数据列,如果您需要帐户信息和 innodb 用于行级锁定和事务,但还希望使配置文件数据可搜索,您将能够这样做,因为您可以利用 myisam 上的全文索引...
      • 我认为何时创建问题无关紧要。如果您将视图与两个表 OUTER JOINED 一起使用,则每当您将数据放入配置文件端时,它都会自行创建。
      • 谢谢@iDevlop - 这是一个非常好的观点,我将实施。再次感谢 i_forget。
      猜你喜欢
      • 2017-09-21
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 2021-10-16
      • 2010-09-21
      相关资源
      最近更新 更多