【问题标题】:SQL tables design one table or two tablesSQL表设计一表或二表
【发布时间】:2016-10-20 21:40:09
【问题描述】:

我有一张大约有 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,我将重复相同的列,但排除不需要的列。这意味着相同的列名,但是存储数据是为了节省空间(没有空值)。

哪种方法更好? 还是有其他方法可以做到这一点?我不是数据库设计的初学者。

【问题讨论】:

    标签: database database-design


    【解决方案1】:

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

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

    基本上:通过将它们全部存储在同一张表中,您不会节省任何东西(不是空间或优化性能或任何东西)。您所做的只是让您自己或其他开发人员日后理解这些数据更加混乱。

    此外,请考虑您将来创建的查询 - 每个查询都必须过滤掉不相关的数据 - 这会使每个查询变得更加复杂。最好将不同的东西存储在不同的表中,这样更容易一目了然地理解数据库+代码中发生的事情

    【讨论】:

    • 好的,我是初学者。那么,我重复与第一个表相同的 15 列并不重要吗?两个表之间的列在某种程度上没有关联,因为这基本上是不同的数据,尽管列名相同。
    • 啊,对了,列名相同没关系...如果数据不同,那么绝对不要仅仅因为列名是相同的。将它们分开。
    • 基本上:通过将它们全部存储在同一个表中,您不会节省任何东西(不是空间或优化性能或任何东西)。您所做的只是让您自己或其他开发人员更难以理解数据。此外,想想您将来创建的查询——每个查询都必须过滤掉不相关的数据——这使得每一个查询都变得更加复杂。最好将不同的东西存储在不同的表中,这样更容易一目了然地理解数据库+代码中发生的事情
    • 那...不是我所说的数据重复。这不是关于 John Doe 在两个表中...而是关于数据是否是同一种东西 - 例如,一个表中的地址字段和另一个表中的地址字段。如果它们都是地址列,那么最好的办法是创建一个“地址”表,并且您的两个表都将引用该表(例如表 1 将有一个 address_id 列,而在表 2 中也将有一个 @ 987654323@专栏)。
    • @ExpertLoser & TarynEast 这与归一化无关,归一化是用总是加入它的投影来替换一个表。它确实与数据库/SQL 中的子类型有关。
    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 2017-05-13
    • 2012-05-22
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多