我正在尝试设计我的数据库的一部分,它应该涵盖用户登录。我的用户可以使用"本地","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
。其中只有一个可能是非空的。
您可以确保其中只有一个在代码中,甚至在数据库中,使用触发器甚至约束,都是非 null 的。