mysql - 对于接受来自多个站点(例如 facebook connect、google、flickr 等)登录的站点,模式的良好做法是什么?

标签 mysql database-design schema database-schema

我问了this questionhttp://dba.stackexchange.com , 但它以一个注释结束,我应该在这里问它,因为它涉及设计而不是管理。

我正在构建一个网站(“The Site”),我正在考虑如何为其设计数据库架构。

我有几个会影响结果的场景:

  • 用户可以选择在站点上注册一个本地帐户,这样他以后就可以使用该帐户登录他在站点上的帐户。
  • 用户可以选择通过其他站点(“外部站点”)(例如 facebook connect、google、foursquare 等)登录,这将使他使用该站点登录他将来在网站上的帐户。
  • 他选择哪种登录方法( native 帐户或外部站点帐户)并不重要,用户将能够通过外部站点(例如 facebook、twitter)在站点上验证他的帐户、instagram 等...),用于在网站.

我应该如何设计数据库的架构?

对于前两个场景,我想到了一个名为 Users 的表,它有一个 id 和一个 type 字段。该类型引用不同的表,例如 FacebookUsersGoogleUsers,每个表都有一个 user_id 字段 - 它与 有外部关系Users.id 字段 - 以及其他字段,例如 first_nameprofile_picture 等。

但这种方法不支持第三种情况。所以我想到了以下几点:
有一个名为 Users 的基表和每个 external site 的表我想让用户连接到我的网站(即网站) .
Users 表将包含有关用户的基本信息(例如 first name, last name, username, password, email - all optional),其中有一列名为 accounts 将保存诸如 native|facebook|twitter 之类的值,或这些值的序列化数组。
外部站点的表(例如FlickrUsers)将保存与用户相关的外部站点的相关数据,以及对Users 表的 user_id 字段。

当用户将他的帐户连接到外部网站(例如 flickr、instagram)时,我会填充该外部网站 表(例如 FlickrUsers) 与该外部站点的相关数据,并将此外部站点的名称作为另一个值添加到 accounts 字段中用户表。

对于使用多帐户登录的网站,我将此作为一般最佳实践问题提出。

话虽如此,我不确定上述方法/设计是否适合我在上面描述的网站。我很清楚正确答案不止一个,但我知道还有更好的解决方案和不太理想的解决方案。我希望找到更好的解决方案。

为了便于讨论,我的 RDBMS 是 mysql,我的语言是 php。

最佳答案

最简单的方法是创建一个包含不同登录方式的表,该表不特定于登录方式。如果他们想添加另一种方式,这只会为您带来更多工作。

表用户
id、姓名等 - 不是密码

表登录验证
id, user_id, type, validation_data

当他们尝试登录时,将登录类型与验证数据相匹配。对于您的站点 (type=YourSite),validation_data 将是一个密码(或散列密码)。对于 type=Facebook,validation_data 将是您使用 Facebook 登录等验证您的网站。

当有人想要登录时,您根据适当类型的 validation_data 验证他们的 ID。

关于mysql - 对于接受来自多个站点(例如 facebook connect、google、flickr 等)登录的站点,模式的良好做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6002569/

相关文章:

javascript - 如何在 ES6 中强制执行严格的类模式

sql - Flyway:无法在 'installed_on' 中插入值 NULL,表 'schema_version' 列不允许为空。插入失败

mysql - 重新架构 MySQL 索引

MySQL-如何实现一张表奇数增加一张表偶数增加

mysql - 如何编写一个 MySQL 查询来通过从中选择一些值来生成一个新表?

mysql:设计实践

database-design - 为 SO 类型的站点创建 "categories"是否值得,或者标签是否可以替代?

sql - 合并包含相同字段的数据库表

php - 如何保护 SQL 查询的输入安全?

php - 类别和子类别