在单个列中使用多个表中的ID

DCN*_*YAM 5 database-design normalization relational-database

我的一位同事创建了一个类似于以下内容的架构。这是一个简化的模式,仅包含解决此问题所需的部分。

系统规则如下:

  1. 部门可以有0到许多部门。
  2. 一个部门只能属于一个部门。
  3. 可以将文章分配给部门或该部门的部门。

该架构为:

Department
---------- 
DepartmentID (PK) int NOT NULL
DepartmentName varchar(50) NOT NULL

Division
--------
DivisionID (PK) int NOT NULL
DepartmentID (FK) int NOT NULL
DivisonName varchar(50) NOT NULL

Article
-------
ArticleID (PK) int NOT NULL
UniqueID int NOT NULL
ArticleName varchar(50) NOT NULL
Run Code Online (Sandbox Code Playgroud)

他使用一个假想规则(由于缺乏更好的术语)定义了架构,所有DepartmentID都在1到100之间,所有DivisionID都在101到200之间。他指出,查询Article表时,您将知道是否唯一ID来自部门表或部门表,具体取决于其所属的范围。

我认为这是一个糟糕的设计,并提出了以下替代方案:

Department
----------
DepartmentID (PK) int NOT NULL
ParentDepartmentID (FK) int NULL /* Self-referencing foreign key.  Divisions have parent departments. */
DepartmentName varchar(50) NOT NULL

Article
-------
ArticleID (PK) int NOT NULL
DepartmentID (FK) int NOT NULL
ArticleName varchar(50) NOT NULL
Run Code Online (Sandbox Code Playgroud)

我相信这是一个适当的规范化架构,可以在尊重上述业务规则的同时,适当地增强关系和数据完整性。

我的具体问题是这样的:

我知道使用一列来包含来自两个域的值是不好的设计,并且我可以在Article表中争辩外键的好处。但是,有人可以提供对特定数据库设计文章/论文的引用,我可以用来备份我的职位。如果我能指出具体的事情,它将使事情变得容易得多。

Dam*_*vic 2

1NF

每个行和列的交集只包含适用域中的一个值(没有其他值)。

http://en.wikipedia.org/wiki/First_normal_form#1NF_tables_as_representations_of_relations

解决问题的最简单方法是为每个部门引入“默认”部门,简单地说就是“整个部门”。之后,只需将所有文章链接到部门即可。也许是这样的(DepartmentDivisionNo = 0指整个部门):

在此输入图像描述