你怎么知道什么时候需要单独的表?

时间:2010-01-20 20:15:32

标签: mysql database database-design

您如何知道何时为非常相似的对象类型创建新表?

例:
要学习mysql,我正在构建一个模型太阳能系统。就我的项目而言,行星与矮行星,半人马和彗星有许多相似的属性。矮行星几乎与行星完全相同。半人马和彗星只与行星不同,因为它们的轨道路径有更多的变化。我应该为每种类型的对象都有一个单独的表,还是应该共享表?

这个例子可能太简单了,但我也对最佳实践感兴趣。我应该使用单独的表格,以防万一我想在将来制作不同的行星和矮行星,或者是将它们保存在同一张桌子中的任何效率原因。

9 个答案:

答案 0 :(得分:3)

Normal forms是你应该感兴趣的。它们几乎是构建表格的惯例。

任何不会破坏firstsecondthird普通形式的设计都可以。这是一个很长的要求清单,所以我建议你从上面的维基百科链接上阅读它。

答案 1 :(得分:2)

这取决于您要存储的有关对象的信息类型。如果所有这些信息都相同,比如轨道半径,质量和名称,那么您可以使用同一个表格。但是,如果每个属性都有不同的属性(比如行星的大气成分等),那么你可以为每个使用单独的表(不是非常规范化),或者有一个表用于基本属性,如轨道,质量和名称,以及第二个表仅适用于行星特有的属性(如果需要,还有类似的彗星表等)。所有对象都在第一个表中,但只有行星位于第二个表中,并通过外键链接到第一个表。

答案 2 :(得分:1)

它被称为Database Normalization

有许多正常形式。通过应用规范化,您将浏览元数据(表格)并更清楚地研究数据之间的关系。通过使用规范化技术,您将优化表以防止冗余。此过程将帮助您根据不同字段之间的关系来了解要创建的实体。

答案 3 :(得分:1)

您应该最有可能拆分有关行星等的数据,以便共享(公共)信息位于另一个表中。

E.g。

Common (Table)
  Diameter (Column)
  Mass (Column)

Planet
  Population

Comet
  Speed

我知道不好的专栏。让Planet和Comet表用一个键链接到Common数据。

答案 4 :(得分:1)

这绝对是一个主观问题。听起来你已经在正确的思路上了。我会问:

  1. 这些对象是否共享许多属性?如果是这样的话,可能至少要考虑一个基表来列出它们。
  2. 一个对象是否“扩展”另一个 - 它具有另一个的所有属性,还有一些额外的东西?如果是这样,可能值得添加另一个带有额外属性的表和一对一映射回基础对象。
  3. 两个对象都有许多共享属性和非共享属性吗?如果是这种情况,可能需要一个表加上一个“数据扩展”系统,其中每个对象可以有一个类型或类别,指定可能与之关联的任何数量的额外属性。
  4. 这些对象只共享一个或两个属性吗?在这种情况下,它们可能不同,可以分成多个表格。
  5. 您也可以问自己如何查询数据。你会想要把它们全部放在同一个列表中吗?将数据与表中的数据结合起来总是一个好主意,通常会查询这些数据。例如,如果您通常想查询所有附件,则“附件”表中的文件可以是图像或视频,而不是图像和视频表。除非有充分的理由,否则不要拆分成多个表。

答案 5 :(得分:0)

如果您希望在一个查询中获得行星和彗星,如果您希望数据库高效工作,它们几乎必须位于同一个表中。应该在你的应用程序内部处理继承:)

答案 6 :(得分:0)

以下是我对类似问题的回答,我认为这也适用于此:

How do you store business activities in a SQL database?

答案 7 :(得分:0)

在关系模型中有许多不同的表达继承的方法。例如,您可以尝试将所有内容压缩到一个表中,并且有一个字段允许您区分不同的类型,或者有一个表用于共享属性,并且具有与具有特定属性等的子表的关系......在任一选择中你还在存储相同的信息。当从域模型转向关系模型时,这就是所谓的阻抗不匹配。两种选择都有不同的权衡,例如,一个表更容易查询,但多个表将具有更高的数据密度。

根据我的经验,最好不要尝试从数据库角度回答这些问题,但让您的域模型(有时是您选择的应用程序框架)驱动表结构。当然,这并不总是一个可行的选择,特别是在涉及到表现时。

我建议你首先在纸上画出你想表达的关系,然后从那里开始。您选择的表结构是否准确表示域?是否可以查询以提取您要报告的信息?你写的查询是复杂还是慢?回答这些问题以及其他类似问题将有助于指导您创建良好的关系模型。

如果您认真学习良好的关系建模原理,我还建议您阅读数据库规范化。

答案 8 :(得分:0)

我可能有一张叫做[HeavenlyBodies]的桌子或者其他类似的东西。然后有一个具有身体类型的查找表,即行星,彗星,小行星,星等。所有人都将分享类似的东西,如名字,大小,重量。到目前为止我读到的大部分答案都有很好的建议。标准化是好的,但我觉得你有时候可以把它放得太远。第3次正常是一个很好的目标。