mysql - 多态关联替代

标签 mysql sql database

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

您可以通过触发器甚至约束来确保其中只有一个在代码中或什至在数据库中为非空。

关于mysql - 多态关联替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45323167/

相关文章:

java - Oracle:意外强制 RR 年份格式

mysql - 无法在 Mysql 中正确获取日期时间数据

java - 提供此供应链问题的递归解决方案

php - 如何修复: Error- No database selected

mysql - 更新交集表,替代删除->插入

android - 什么是 MINI_THUMB_MAGIC 以及如何使用它?

database - 在 Postgres 中存储矢量数据的有效方法是什么?

mysql - 创建一个查询以获得两个相同的结果

php - 使用 PHP 进行表单和 SQL 验证

sql - 将 SQL Server 中的 XML 查询结果分配给 XML 类型变量会产生错误