SQL表设计一个或两个表

时间:2016-10-20 21:40:09

标签: database database-design

我有一张约20列的表格。它工作得很好,它与其他表有很多相关,但它工作正常,设计目前还不错。

现在我需要存储另一种类型的数据,它们具有几乎相同的列,它有15列基本相同,但是5列完全不同 这两种类型之间。那我该怎么做呢 1.我将它存储在一个表中(通过在第一个表中添加新列 - >这样,根据我们保存的数据类型,大约5列将为空),或者 2.将其拆分为2个表,并且每个表在其他表中重复相同的列 3.其他一些方式?

列案例1 - 存储在同一个表中

ID            INTEGER
Description   NVARCHAR(max)
Value         FLOAT
ValueEUR      FLOAT
ValueUSD      FLOAT
YearOfBuilt   SMALLINT
New           BIT
Requirements  NVARCHAR(max)
FIELD A1
FIELD A2
FIELD A3
FIELD A4
FIELD A5
FK_TypeID     INT

我在上表中为其他文档类型添加了5个新字段:

FIELD B1      FLOAT
FIELD B2      FLOAT
FIELD B3      FLOAT
FIELD B4      FLOAT
FIELD B5      FLOAT

在这种情况下,如果我保存类型1的数据 列FIELD B1,... FIELD B5的已保存字段值 null 。 好吧,它会起作用,但是根据类型,某些字段会为空。

或者如下面的案例2那样进行表格设计

列案例2 - 存储在两个表格中

表1

ID            INTEGER
Description   NVARCHAR(max)
Value         FLOAT
ValueEUR      FLOAT
ValueUSD      FLOAT
YearOfBuilt   SMALLINT
New           BIT
Requirements  NVARCHAR(max)
FIELD A1
FIELD A2
FIELD A3
FIELD A4
FIELD A5
FK_TypeID     INT

表2 - 重复相同的列,但不包括此表不需要的列

ID            INTEGER
Description   NVARCHAR(max)
Value         FLOAT
ValueEUR      FLOAT
ValueUSD      FLOAT
YearOfBuilt   SMALLINT
New           BIT
Requirements  NVARCHAR(max)
FIELD B1      FLOAT
FIELD B2      FLOAT
FIELD B3      FLOAT
FIELD B4      FLOAT
FIELD B5      FLOAT
FK_TypeID     INT

现在在这种情况下2,我会重复相同的列,但不包括不需要的列。这意味着相同的列名称,但存储数据以节省空间(无空值)。

哪种方法会更好? 或者还有另一种方法吗?我不是数据库设计的初学者。

1 个答案:

答案 0 :(得分:1)

通常我们会分成两个表 - 这称为数据库规范化:https://en.wikipedia.org/wiki/Database_normalization

特别是如果相同列以某种方式相关,例如,如果它们是两种不同类型的人(例如客户与员工)的联系人详细信息,那么您可以在此之后命名新表(例如,将调用新数据库) contact_details等等。

基本上:你不是通过将它们全部存储在同一个表中来保存任何东西(不是空间或优化性能或任何东西)。您所做的一切就是让您自己或其他开发人员在将来更容易理解数据。

另外,考虑一下您创建的未来查询 - 每个查询都必须过滤掉不相关的数据 - 这会使每个查询更加复杂。最好将不同的东西存储在不同的表中,以便更容易理解 - 一目了然数据库+代码中发生了什么