关系数据库devise多种用户types

我有4种types的用户,每个都有特定的数据,但他们也共享通信数据,如usernamepassword

我的第一个想法是创build一个user_type列的主要users表。 然后当查询用户数据时,我可以先select他们的user_type ,然后根据output运行不同的查询来获取“用户types”特定的数据。 我不喜欢这个,因为我希望我能抓住所有用户相关的数据与一个查询,最好使用外键。

第二个想法是在users表中没有user_type列,而是使用来自特定用户types表的外键将指向主users表的行。 我喜欢这个好一点,但我想我将不得不运行N个查询,其中N是每次我需要抓取用户数据的用户types的数量。

还有其他的select吗? 在这种情况下,最好的做法是什么?

非常感谢

你的情况看起来像一个类/子类的实例。

有两种经典的方法来deviseSQL表来处理子类。 各有优点和缺点。

一种方式称为“单表inheritance”。 在这个devise中,所有types的用户只有一个表格。 如果给定的列不属于给定的行,则交集保留NULL。 可以添加一列来指示用户types。

另一种方式称为“类表inheritance”。 这很像Nanego给出的答案,只是做了一些小的改动。 有一个用户表,所有的常用数据,和一个ID字段。 每个子类都有一个表,数据与这个子类相关。 id字段通常设置为用户表中匹配行中的id字段的副本。 通过这种方式,子类可以执行双重任务,既可以作为主键,也可以作为引用用户表的外键。 这最后一项技术被称为“共享主键”。 插入时需要一点编程,但是非常值得。 它强化了这种关系的一对一性质,并加速了必要的联结。

您可以将所有这三种devise作为SO标签或Web上的文章进行查找。

单表inheritance 类表表inheritance 共享主键

尽pipe磁盘空间的使用效率更高,但分割成单独表格的问题是,您实际上需要有条件的连接 – 根据user_type连接到用户types特定的表格。 这是一个痛苦的代码作为SQL,这些谁在乎磁盘空间?

更好的select是让一个用户表具有足够的列来存储关于任何用户types的信息,知道某些列不会用于某些用户types。 具有未使用的列的“低效率”在执行速度和查询简单性方面将得到补偿。

如果你得到另一个用户types,它也很容易扩展 – 添加列比添加表要容易得多,而且当你添加更多的用户types时,对新列的需求会减less(只是没有那么多不同关于你需要存储的用户的东西)

我这样做的方法是创build一个具有公共字段的表“Person”,以及具有外部关键字“person_id”的每个types的用户的一个表。

在你的请求中,你只需要用foreign_key连接两个表就可以获得一种types用户的所有数据。

你有几种types的用户?