我正在尝试设计一个应该覆盖用户登录的数据库的一部分。我的用户可以使用“本地”,“脸谱”或“谷歌”帐户登录。
我所拥有的是一个包含两列的表用户,login_type login_id。 login_type的值可以是“local”,“facebook”或“google”,它指的是三个表:local,facebook和google。 login_id是login_type引用表的id。
我不喜欢这种多态关联,并且会通过创建像往常一样引用外键的表来重新设计这部分以保持数据库简单和连贯。
感谢任何建议
此致
答案 0 :(得分:1)
您正在做的是在对象关系映射(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
。其中只有一个可能是非空的。
您可以确保其中只有一个在代码中是非空的,甚至在带有触发器的数据库中也是如此。