我有4种类型的用户,每个都有具体的数据,但他们也分享COMMUN数据,如username,password..
username
password
我的第一个想法是users用user_type列创建一个主表。然后,当查询用户数据时,我可以先选择它们user_type,然后根据output运行情况选择不同的查询来获取“用户类型”的特定数据。我对此并不满意,因为我希望我可以通过一个查询并最好使用外键来获取所有与用户相关的数据。
users
user_type
output
第二个想法是user_type在users表中没有列,而是使用外键,该键来自特定用户类型的表将指向主users表的一行。尽管我想我将必须运行N个查询,但我还是会更好一些,其中N是每次我需要获取用户数据时用户类型的数量。
还有其他选择吗?在这种情况下,什么是好的做法?
非常感谢
您的案例看起来像是类/子类的实例。
有两种设计SQL表以处理子类的经典方法。每种都有优点和缺点。
一种方法称为“单表继承”。在此设计中,只有一张桌子可供所有类型的用户使用。如果给定的列与给定的行不相关,则交集为NULL。可以添加一列以指示用户类型。
另一种方法称为“类表继承”。这很像Nanego给出的答案,但做了一些小的更改。有一个供用户使用的表,其中包含所有常用数据和一个id字段。每个子类都有一个表,其中包含与该子类有关的数据。id字段通常设置为用户表中匹配行中id字段的副本。这样,子类键可以起到双重作用,既充当主键又充当引用用户表的外键。最后一种技术称为“共享主键”。插入时需要一些编程,但这是值得的。它增强了关系的一对一性质,并加快了必要的联接。
您可以将所有这三种设计查找为SO中的标签或Web上的文章。
单表继承 类表继承 共享主键