在您开始阅读规范化之前,直到您对此完全没有疑问。如果你只是在学校做这个,你可能还没有足够的了解它来设计。
仔细收集您对每个模块的要求。你需要知道:
业务规则(特定于应用程序并且必须在数据库中强制执行,因为无论来源如何,它们都必须对所有记录强制执行),
是否存在法律或监管问题(例如 HIPAA 或 Sarbanes-Oxley 要求)
安全性(数据是否需要加密?)
您需要存储哪些数据以及为什么(这些数据在其他任何地方都可用)
哪些数据只有一行数据,哪些需要多行数据?
您打算如何强制每个表中行的唯一性?您有自然键还是需要代理键(几乎在所有情况下都建议使用代理键)?
您需要复制吗?
您需要审核吗?
如何将数据输入数据库?它是一次来自应用程序一条记录(甚至来自多个应用程序),还是来自 ETL 工具或另一个数据库的批量插入。
您是否需要知道谁输入了记录以及何时输入(这在企业系统中很可能是必需的。
您需要什么样的查找表?当您可以使用查找表并将用户限制为值时,数据输入会更加准确。
您需要什么样的数据验证?
系统大约有多少条记录?您需要有一个想法才能知道创建测试数据有多大。
您将如何查询数据?您将使用存储过程或 ORM 或动态查询吗?
在您的设计中要记住一些非常基本的事情。为您的数据选择正确的数据类型。不要在字符串字段中存储您打算对其进行数学运算的日期或数字。将不是数学候选的数字(部件号、邮政编码、电话号码等)存储为字符串数据,因为您可能需要前导零。不要在一个字段中存储多条信息。所以没有逗号连接的列表(这些表示需要一个相关的表),当你发现自己在做类似 phone1、phone2、phone 3 的事情时,请立即停下来设计一个相关的表。出于数据完整性目的使用外键。
在您的设计中始终考虑数据完整性。没有完整性的数据是没有意义和无用的。为性能而设计,这在数据库设计中至关重要,而不是过早的优化。数据库不容易重构,因此重要的是在第一时间就将性能方程式中最关键的部分弄对。事实上,所有数据库都需要针对数据完整性、性能和安全性进行设计。
不要害怕有多个连接,正确索引这些会执行得很好。不要试图将所有内容都放入实体值类型表中。尽量少用这些。尝试学习从处理数据集的角度进行思考,这将有助于您的设计。数据库经过优化,可以成套地做事。
还有更多,但这足以开始消化。