我是一名学生,我正在尝试设计一个简单的数据库,所以如果这些想法看起来很糟糕,请告诉我如何改进。
我脑子里有三张桌子,一张给教授,一张给学生。他们都有联系方式。我需要知道实现三者之间关系的最佳实践是什么。
我看到两种可能性:A)让教授和学生表都使用自动增量字段和补充默认初始化字段(假设教授为 1,学生为 2)。然后在第三个表 (Contacts) 中创建一个键作为唯一 ID 和默认初始化字段的组合。
B) 有 for 表而不是三个,有两个与 ContactStudents 和 ContactProfessors 相同的结构表,每个表都为相应的表服务。
从我的角度来看,我会选择第一个,因为如果我想向 Contact 表添加新字段,两者都会从中受益。
你认为哪一个最好,为什么?有没有另一种更好的方法来实现这一目标?
编辑:
在各种答案之后,在 zagrimsan 的建议下,我添加了以下要求:学生也可以是教授。一个人(教授的学生)可以有多个联系人。一个联系人可以被多个学生和教授(同种)重复使用,但不能同时被学生和教授重复使用,除非同一个学生也是教授。
涉及类和子类(或者,如果您愿意,也可以是类型和子类型)的问题在数据库设计中一直存在。你的情况看起来就是一个很好的例子。
在您的情况下,这就是我要做的,使用称为类表继承的技术与称为共享主键的技术相结合。
创建三个表:联系人、教授和学生。对联系人表的 ID 字段使用自动编号功能。在其他两个表中有一个 ID 字段,但不要使用自动编号功能。相反,每当您插入新联系人时,获取刚为新联系人生成的 ID 字段,并提供该 ID 字段作为教授或学生中 ID 的值。ID 字段被声明为所有三个表中的主键。您甚至可以创建一个既是学生又是教授的联系人,如果这在您的情况下有意义的话。
按照您的建议,您可以根据属性将其他属性放在适当的表中。
ID 保证在所有三个表中都是唯一的。如果您只需要有关学生的数据,请加入在 ID 字段上匹配的联系人和学生。关于教授的数据也是如此。
以这种方式使用共享主键会强制执行学生或教授与联系人之间的 1:1 关系。
祝你好运!