Mysql 多态关联选择

Mysql 多态关联选择,mysql,sql,database,Mysql,Sql,Database,我正在尝试设计我的数据库的一部分,它应该包括用户登录。我的用户可以使用“本地”、“facebook”或“谷歌”帐户登录 我拥有的是一个包含两列的表users,login\u type login\u id。 login_type的值可以是“local”、“facebook”或“google”,这表示三个表:local、facebook和google。 login\u id是引用的登录类型表的id 我不喜欢这种多态关联,我将重新设计这一部分,通过创建像往常一样使用外键引用的表来保持数据库的简单和一

我正在尝试设计我的数据库的一部分,它应该包括用户登录。我的用户可以使用“本地”、“facebook”或“谷歌”帐户登录

我拥有的是一个包含两列的表users,login\u type login\u id。 login_type的值可以是“local”、“facebook”或“google”,这表示三个表:local、facebook和google。 login\u id是引用的登录类型表的id

我不喜欢这种多态关联,我将重新设计这一部分,通过创建像往常一样使用外键引用的表来保持数据库的简单和一致性

谢谢你的建议


在对象关系映射(ORM)系统中,您所做的是一个被称为鉴别器列的技巧。正如您已经了解的,它的问题是引用完整性不存在,因为您不能将您的
login\u id
声明为映射到另一个表的外键,因为它可能映射到三个可能的表之一,它映射到的表由
login\u 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\u type
列被放弃,而是引入了三个可为空的外键:
local\u users\u id
facebook\u users\u id
,以及
google\u users\u id
。其中只有一个可以是非空的


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

您所做的是一个在对象关系映射(ORM)系统中称为鉴别器列的技巧。正如您已经了解的,它的问题是引用完整性不存在,因为您不能将您的
login\u id
声明为映射到另一个表的外键,因为它可能映射到三个可能的表之一,它映射到的表由
login\u 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\u type
列被放弃,而是引入了三个可为空的外键:
local\u users\u id
facebook\u users\u id
,以及
google\u users\u id
。其中只有一个可以是非空的



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

请您更详细地解释一下“local”、“facebook”和“google”表的结构,它们的用途是什么,以及它们与其他表的关系。“which names is”部分的英文不正确,因此不可理解。基本上,用户记录指向本地、facebook或google表,并且关联是通过列login_type的值完成的。反转FK,让本地、facebook和google表引用用户表。Serg,这是一个好把戏。必须为应用程序添加更多逻辑,但绝对可行。谢谢,请更详细地解释一下“本地”、“facebook”和“谷歌”表的结构,它们的用途,以及它们与其他表的关系。“which names is”部分的英文不正确,因此不可理解。基本上,用户记录指向本地、facebook或google表,并且关联是通过列login_type的值完成的。反转FK,让本地、facebook和google表引用用户表。Serg,这是一个好把戏。必须为应用程序添加更多逻辑,但绝对可行。感谢如果包含新的帐户类型,则此设计的列数可能会有所不同。谢谢,列的数量可能会有所不同,这很好。否则就不能有引用完整性。Mike,这有一个目前无法很好确定的代价。正如Serg所建议的,通过还原引用键,可以很好地保证数据库的完整性。谢谢如果您还原引用键,则需要进行N次查询才能获得完整的行。在我的方案中,您只需要1个具有N个联接的查询,其中只有1个联接将实际导致搜索,因为其他N-1键将为null。我明白您的意思,但应用程序知道哪个是登录类型表。一个连接就足以获得所需的数据。应用程序知道用户是否希望在本地登录,facebook或其他什么,因此登录类型表在应用程序级别进行标识。如果包含新的帐户类型,则列数可能与此设计不同。谢谢,列的数量可能会有所不同,这很好。否则就不能有引用完整性。Mike,这有一个目前无法很好确定的代价。正如Serg所建议的,通过还原引用键,可以很好地保证数据库的完整性。谢谢如果您还原引用键,则需要进行N次查询才能获得完整的行。在我的方案中,您只需要1个具有N个联接的查询,其中只有1个联接将实际导致搜索,因为其他N-1键将为null。我明白您的意思,但应用程序知道哪个是登录类型表。一个连接就足以获得所需的数据。应用程序知道用户是否想在本地登录,facebook或其他什么,所以登录类型表是在应用程序级别识别的