我在标准化阵营。
这里有一些提示可以帮助您入门:
从一个进程开始,为每个进程分配一些任意的唯一标识符
“人”。将此称为PersonId 或类似名称。这个标识符被称为
一个代理键。代理键的唯一目的是
保证它与现实世界中的真人之间的一对一关系。使用
将某些其他属性的值与“人”相关联时的代理键
你的数据库。
当您开发数据库布局时,您可能会发现代理键是必要的(或至少有用)
也适用于其他一些属性。
查看您要管理的每个属性。问以下问题:
任何给定的人是否对该属性只有一个值?
例如,每个人
有一个“出生日期”。但是他们怎么可能有“爱好”呢?可能是零到很多。
单值属性(例如出生日期、身高、体重等)是进入
以PersonId 为键的公用表。每个表中的属性数不应该
在这一点上值得关注。
Hobby 等多值属性需要稍有不同
治疗。您可能希望为每个多值属性创建单独的表。使用爱好作为
例如,您可以创建下表PersonHobby(PersonId, Hobby)。此表中的一行可能看起来
类似:(123, "Stamp Collecting")。这样你可以录制尽可能多的
爱好按每个人的需要,每排一个。对“兴趣”、“技能”等做同样的事情。
如果有相当多的多值属性
PersonId + Hobby 的组合没有其他决定(即你没有任何有趣的东西
记录这个人做这个“爱好”或“兴趣”或“技能”)你可以把他们归为一类
具有类似PersonAV(PersonId, AttributeName, Value) 的结构的属性值表。这里可能有一排
看起来像:(123, "Hobby", "Stamp Collecting")。
如果你走这条路,替换也是一个好主意
PersonAV 表中的 AttributeName 作为代理键并创建另一个表来关联这个
其描述的关键。
类似:Attribute(AttributeId, AttributeName)。此表中的一行看起来像
(1, "Hobby") 和对应的 PersonAV 行可以是 (123, 1, "Stamp Collecting")。这是
通常这样做是为了如果您需要知道哪些AttributeNames 在您的数据库/应用程序中是有效的
你有一个地方可以查到它们。考虑如何验证“兴趣”是否是有效值
AttributeName 与否 - 如果您还没有记录某人拥有 AttributeName,那么有
在您的数据库中没有 AttributeName 的记录 - 您如何知道它是否应该存在?在Attribute 表中查找!
某些属性可能有多个关系,这也会影响表的规范化方式。我没有
在您的示例中查看这些依赖项中的任何一个,因此请考虑以下内容:假设我们有一个仓库
充满零件,PartId 确定其WeightClass、StockCount 和ShipCost。这表明一个表
类似:Part(PartId, WeightClass, StockCount, ShipCost)。但是,如果之间存在关系
非关键属性,那么它们应该被分解出来。例如直接假设WeightClass
确定ShipCost。这意味着仅WeightClass 就足以确定ShipCost 和ShipCost 应该被排除在Part 表之外。
规范化是一门相当微妙的艺术。您需要确定功能依赖关系
存在于数据模型中的所有属性之间,以便正确执行。只是
提出功能依赖关系需要相当多的思考和考虑 - 但它
对于进行正确的数据库设计至关重要。
我鼓励你花时间
在构建数据库之前多研究规范化。在这里度过了几天
将来会为自己付出更多的代价。尝试做一些谷歌/维基百科搜索
“功能依赖”、“规范化”和“数据库设计”。阅读、研究、学习,然后正确构建它。
我就规范化数据库设计提出的建议只是对您可能需要采取的方向的提示。如果对您试图在应用程序中管理的所有数据没有深入了解,那么这里给出的任何建议都应该“持保留态度”。