DCN*_*YAM 5 database-design normalization relational-database
我的一位同事创建了一个类似于以下内容的架构。这是一个简化的模式,仅包含解决此问题所需的部分。
系统规则如下:
该架构为:
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表中争辩外键的好处。但是,有人可以提供对特定数据库设计文章/论文的引用,我可以用来备份我的职位。如果我能指出具体的事情,它将使事情变得容易得多。
1NF
每个行和列的交集只包含适用域中的一个值(没有其他值)。
http://en.wikipedia.org/wiki/First_normal_form#1NF_tables_as_representations_of_relations
解决问题的最简单方法是为每个部门引入“默认”部门,简单地说就是“整个部门”。之后,只需将所有文章链接到部门即可。也许是这样的(DepartmentDivisionNo = 0指整个部门):
