Language agnostic 构造数据库表的适当方法?(空列与多个表)

Language agnostic 构造数据库表的适当方法?(空列与多个表),language-agnostic,database-design,schema,relational-database,schema-design,Language Agnostic,Database Design,Schema,Relational Database,Schema Design,假设我们有一个叫做Widget的对象,我们可以为它构造一个数据库表 现在,假设我们有两组额外的细节来描述小部件。每组数据在单独的时间可用。所以,假设我们的小部件的生命周期有三个阶段 在阶段1中,我们只需要一个带有名称和描述的小部件 widgets ------- id (PK) name description 在第2阶段,我们的小部件获得了一个高度和重量 widgets ------- id (PK) name description height weight 在第3阶段,我们的小部件获

假设我们有一个叫做Widget的对象,我们可以为它构造一个数据库表

现在,假设我们有两组额外的细节来描述小部件。每组数据在单独的时间可用。所以,假设我们的小部件的生命周期有三个阶段

阶段1中,我们只需要一个带有名称和描述的小部件

widgets
-------
id (PK)
name
description
在第2阶段,我们的小部件获得了一个高度和重量

widgets
-------
id (PK)
name
description
height
weight
第3阶段,我们的小部件获得了目的地和运输成本

widgets
-------
id (PK)
name
description
height
weight
destination
shipping_cost
上面的模式(对于“阶段3”)意味着阶段1或阶段2中小部件的数据库记录将具有空值

或者,我们可以构造一个永远不会有空值的模式(但是根据小部件生命周期的当前阶段,父记录可能有零个、一个或两个子记录):

这些选择中的一个总是正确的吗?每种方法都有合理的利弊吗?如果答案取决于更多的变量,它们是什么?在什么条件下,一种选择会成为明显的首选

公认的答案将引用一个关于这个话题的现代权威来源


编辑:我觉得这很容易引起争论,但这也是一个应该有合理利弊的话题,因此是一个权威的答案。这个问题只是一个困扰我的问题,因为我看到它是双向的,没有理由也没有考虑替代方案。我只想知道,根据当前的趋势设置DBA类型,哪个是正确的。

减少空列的选项是创建一对一关系,或者一个小部件可以有多个重量和交付规格

这还意味着您必须左连接到两个支持表以检查信息,其中一个表不需要任何特殊的内容(在某些情况下,除了IS/IS NOT NULL检查)


一对一关系是一种性能优化,但这不是你问这个问题的原因…

你减少空列的选项是创建一对一关系,或者一个小部件可以有多个重量和交付规格

这还意味着您必须左连接到两个支持表以检查信息,其中一个表不需要任何特殊的内容(在某些情况下,除了IS/IS NOT NULL检查)

一对一关系是一种性能优化,但这并不是你问这个问题的原因…

标准形式(BCNF/5NF)通常是数据库设计最可靠的基础,除非你找到令人信服的理由偏离它。这意味着不带null的模式应该是首选的。标准化减少了冗余数据和出现异常的可能性,并最大限度地减少了设计中固有的“偏差”,使其更易于维护和扩展

空值使数据库上的大多数操作复杂化,并导致某些查询的结果不正确。只有在您发现这样做的一些特殊原因的设计中才添加空值-通常这些原因与DBMS限制有关,这些限制不允许您在不使用空值的情况下轻松实现某些约束或其他逻辑。还要记住,每当数据库设计器向数据库中添加空值时,为了最终用户的利益,应用程序设计器通常必须做额外的工作来删除或隐藏它们

在Fabian Pascal的书《数据库管理中的实际问题》以及E.F.Codd、Witold Lipski和许多其他人的Chris Date和论文中,您可以找到关于空值和其他与缺失数据有关的问题的广泛讨论。

标准格式(BCNF/5NF)通常是数据库设计最可靠的基础,除非您找到令人信服的理由偏离它。这意味着不带null的模式应该是首选的。标准化减少了冗余数据和出现异常的可能性,并最大限度地减少了设计中固有的“偏差”,使其更易于维护和扩展

空值使数据库上的大多数操作复杂化,并导致某些查询的结果不正确。只有在您发现这样做的一些特殊原因的设计中才添加空值-通常这些原因与DBMS限制有关,这些限制不允许您在不使用空值的情况下轻松实现某些约束或其他逻辑。还要记住,每当数据库设计器向数据库中添加空值时,为了最终用户的利益,应用程序设计器通常必须做额外的工作来删除或隐藏它们


在Fabian Pascal的书《数据库管理中的实际问题》以及E.F.Codd、Witold Lipski和许多其他人的Chris Date和论文中,你可以找到关于空值和其他与缺失数据有关的问题的广泛讨论。

只是一个观察,我打算回应,但是这句话“被接受的答案将引用有关该主题的现代权威来源。“真让我讨厌。这是一个同侪帮助论坛,不是有偿工作,这项规定似乎对寻求免费帮助的人要求过高。当然,这只是我的观点,但我很好奇,看看其他人是否也会因此而感到不快。@Serapth+1,仅仅因为我是权威的,但不太现代:)只是一个观察,我本来打算回应的,但那句话“公认的答案将引用一个关于这个话题的现代权威来源。”真的让我不快。这是一个同侪帮助论坛,不是有偿工作,这项规定似乎对寻求免费帮助的人要求过高。当然,这只是我的意见,但我很好奇,看看其他人是否也会因此而感到不快。@Serapth+1,仅仅因为我是权威的,但不太现代:)要回答你的问题,从父窗口小部件表到子表的关系是一对一的。要回答你的问题,从父窗口小部件表到子表的关系是一对一的。
widgets
-------
id (PK)
name
description

widget_specs
-------
id (PK)
widget_id (FK)
height
weight

widget_delivery
-------
id (PK)
widget_id (FK)
destination
shipping_cost