我正在尝试设计数据库的一部分,该部分应涵盖用户登录。我的用户可以使用“本地”、“facebook”或“google”帐户登录。
我拥有的是一个包含两列的用户表,login_type login_id。 login_type 的值可以是“local”、“facebook”或“google”,分别指三个表:local、facebook 和 google。 login_id是login_type引用的表的id。
我不喜欢这种多态关联,并且会重新设计这部分,通过创建像往常一样使用外键引用的表来保持数据库简单和一致。
感谢任何建议
问候
最佳答案
您正在做的事情是对象关系映射(ORM)系统中称为“鉴别器列”的技巧。正如您已经了解的那样,它的问题在于引用完整性被排除在外,因为您无法将您的 login_id
声明为映射到另一个表的外键,因为它可能映射到其中一个表三个可能的表,其映射到的表由 login_type
列的值选择。
正确执行此操作的方法可能看起来有点奇怪,但它确实保证了引用完整性。
Table users columns:
id primary key
local_users_id foreign key, references local_users(id)
facebook_users_id foreign key, references facebook_users(id)
google_users_id foreign key, references google_users(id)
因此,login_type
列被放弃,而是引入了三个可为空的外键:local_users_id
、facebook_users_id
和 google_users_id
。其中只有一个可以为非空。
您可以通过触发器甚至约束来确保其中只有一个在代码中或什至在数据库中为非空。
关于mysql - 多态关联替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45323167/