Wiki:数据库规范化
实现精心设计的数据库 在关系数据库设计理论中,规范化规则识别在精心设计的数据库中必须存在或不存在的某些属性.有一些规则可以帮助您实现健全的数据库设计:
表应该有一个标识符.数据库设计理论的基本规则是每个表应该有一个唯一的行标识符,一列或一组列用于区分任何单个记录与表中的每个其他记录.每个表都应该有一个ID列,并且没有两个记录可以共享相同的ID值.用作表的唯一行标识符的一列或多列是表的主键.在AdventureWorks数据库中,每个表都包含一个标识列作为主键列.例如,VendorID是Purchasing.Vendor表的主键.
表应仅存储单一类型实体的数据.尝试在表中存储过多信息会妨碍对表中数据的有效和可靠管理.在AdventureWorks示例数据库中,销售订单和客户信息存储在单独的表中.虽然您可以在一个表中包含包含销售订单和客户信息的列,但此设计会导致一些问题.必须为每个销售订单添加和存储客户信息,名称和地址.这会在数据库中使用额外的存储空间.如果客户地址发生变化,则必须对每个销售订单进行更改.此外,如果从Sales.SalesOrderHeader表中删除了客户的上一个销售订单,则该客户的信息将丢失.
表应该[尝试]避免可以为空的列.表可以定义列以允许空值.空值表示没有值.虽然在单独的情况下允许空值可能很有用,但应谨慎使用它们.这是因为它们需要特殊处理,这增加了数据操作的复杂性.如果您有一个包含多个可空列的表,并且其中几行在列中具有空值,则应考虑将这些列放在链接到主表的另一个表中.通过将数据存储在两个单独的表中,主表可以设计简单并且仍然可以处理存储该信息的偶然需要.
表不应具有重复值或列.数据库中项目的表不应包含特定信息的值列表.例如,AdventureWorks数据库中的产品可能是从多个供应商处购买的.如果Production.Product表中有供应商名称的列,则会产生问题.一种解决方案是在列中存储所有供应商的名称.但是,这使得很难显示各个供应商的列表.另一种解决方案是更改表的结构,以便为第二个供应商的名称添加另一列.但是,这只允许两个供应商.此外,如果一本书有三个供应商,则必须添加另一列.如果您发现必须在单个列中存储值列表,或者如果您有多个列用于单个数据,例如TelephoneNumber1和TelephoneNumber2,则应考虑将重复数据放在另一个带有链接的表中回到主表.AdventureWorks数据库有一个产品信息的Production.Product表,供应商信息的Purchasing.Vendor表和第三个表Purchasing.ProductVendor.第三个表仅存储产品的ID值和产品供应商的ID.此设计允许产品的任意数量的供应商,而无需修改表的定义,也无需为单个供应商的产品分配未使用的存储空间.
参考.