如何定义数据库表之间的关系(2)
如何定义数据库表之间的关系(2)
建立关系在开始着手考虑建立关系表之间的关系之前,你可能需要对数据非常熟悉.只有在熟悉数据之后,关联会比你刚开始的时候更明显.你的数据库系统依赖于在两个数据表中找到的匹配值来建立关系.如果在数据库系统中发现了一个匹配值,系统将从两个数据表中提取数据并创建一个虚拟的记录.例如,你可能想要查看某个特定的作者所写的全部书籍,在本文中,系统将从“books”和“authors”这两个数据表中查找相关的匹配值.需要注意的是,在大多数情况下,查询的结果是动态的,这意味着对这条虚拟记录所做的任何改动都将可能作用到底层的数据表上,这一点是非常重要的.
进行匹配的值都是主键和外键的值.(关系模型不要求一个关系必须对应的使用一个主键来确定.你可以使用数据表中的任何备选关键字来建立关系,但是使用主键是大家都已经接受的标准.)主键(primary key)唯一的识别表中的每个记录.而外键(foreign key)只是简单的将一个数据表中的主键存放在另外一个数据表中.同样地,对于你来说也不需要做太多的工作——只是简单地将主键加到关系表中,并将其定义为外键.
唯一需要注意的是,外键字段的数据类型必须和主键的数据类型相同.但是有些系统可以允许这条规则有一个例外,它允许在数字和自动编号(autonumbering)字段(例如在sql服务器系统中访问identity和autonumber)之间建立关系.此外,外键的值可以是空(null),尽管强烈建议在没有特别原因的情况下,不要让外键为空.你有可能永远都不会有机会来使用需要这项功能的数据库.
现在回到我们的示例关系表,并开始输入合适的外键.(请继续在纸上打草稿——在你的数据库系统中创建真正的数据表还为时过早.要知道在纸上纠正错误要容易得多.)要记住,你正在把主键的值添加到关系表里.只要调用实体之间的关系就行了,而其他的就简单了:
书籍和分类是有关系的.
书籍和出版社是有关系的.
书籍和作者是有关系的.
作者和邮政编码(zip)是有关系的.
邮政编码和城市是有关系的.
城市和州是有关系的.
这一步并不是一成不变的,你可能会发现在规范化的过程中加入外键会更容易一些.在把字段移动到一个新的数据表时,你可能要把这个新数据表的主键添加到原来的数据表里,将其作为外键.但是,在你继续规范化剩余数据的时候,外键常常会发生改变.你会发现在所有这些数据表被全部规范化之后,一次添加所有的外键,这样效率会更高.
操作数据表现在让我们一次操作一个数据表,就从books数据表开始,它在这个时候只有三个字段.