多态性关联替代



我正在尝试设计我的数据库的一部分,它应该涵盖用户登录。我的用户可以使用"本地","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_idfacebook_users_idgoogle_users_id。其中只有一个可能是非空的。

您可以确保其中只有一个在代码中,甚至在数据库中,使用触发器甚至约束,都是非 null 的。

最新更新