【问题标题】:Reach third normal form达到第三范式
【发布时间】:2015-02-26 04:29:18
【问题描述】:

请参阅下面的 DDL:

CREATE TABLE dbDeletion
  (
     reference       INT IDENTITY PRIMARY KEY,
     reviewreference INT,
     PersonID        INT,
     EventID         INT,
     [delete]        BIT,
     Deleted         BIT,
     Checked         BIT
  )

INSERT INTO dbdeletion
            (reviewreference,
             personid,
             eventid,
             [delete],
             deleted,
             checked)
VALUES      (1,1,4,0,0,0),
            (2,2,4,1,0,1),
            (3,1,4,1,1,0)

我相信这个设计是第二范式,但我想检查一下。

我认为它是第二范式的原因是因为“已删除”和“已检查”属性,即每次将记录标记为删除时 (dbdeletion.delete=1),然后检查记录以查看是否它可以被删除。如果可以删除,则将其删除并将 dbdeletion.deleted 设置为 1,否则将 dbdeletion.checked 设置为 1。

当 dbdeletion.deleted 设置为 1 时,设置如下:

update dbdeletion set deleted=1 where PersonID=@PersonID and EventID=@EventID

当 dbdeletion.checked 设置为 1 时,设置如下:

update dbdeletion set checked=1 where PersonID=@PersonID and EventID=@EventID

上面的两条 SQL 语句更新了 1 行或多行。因此我相信这不是第三范式。对吗?

【问题讨论】:

    标签: sql sql-server database-normalization


    【解决方案1】:

    让我们逐步了解这一点。

    1. 所有字段都包含一个且只有一个信息。 1NF 通过
    2. 主键是referencereviewreference 是候选键。 PersonIDEventID 不是候选键,因为它们不能唯一标识记录。由于候选键是原子的,因此另一个属性无法依赖于候选键的一部分。 2NF 通过
    3. 主键是referencereviewreference是候选键。其余信息均指这些候选键,不依赖于这些候选键之外的任何信息。 3NF 通过

    【讨论】:

    • 谢谢。 +1 表示彻底。 “已检查”和“已删除”呢?当我想为一个人更新任一字段时,id 组合将更新多行。他们应该自己坐在桌子上吗?
    • 已删除标志和检查标志针对 personid,eventid。
    • 您上面的示例表明deleted 独立于非主键。除了deleted,您的第一条和第三条记录相同。至于checked,您可能会认为这取决于PersonIDEventID 的组合,但我们已经确定该组合不是表的候选键。您也可以使用PersonIDEventID 的相同组合将新记录添加到表中,并将checked 设置为0,直到执行检查。
    • reviewreference 不是候选键。首先是因为它可以为空,其次因为该列上不存在唯一性约束,因此无法根据提供的信息推断它应该是候选键。
    • @sqlvogel 感谢您的关注。我可能一直在阅读定义中不存在的结构的一些意图。
    猜你喜欢
    • 2013-12-13
    • 2021-11-21
    • 2013-09-06
    • 2017-05-27
    • 1970-01-01
    • 2015-09-08
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多