我问了this question在 http://dba.stackexchange.com , 但它以一个注释结束,我应该在这里问它,因为它涉及设计而不是管理。
我正在构建一个网站(“The Site”),我正在考虑如何为其设计数据库架构。
我有几个会影响结果的场景:
- 用户可以选择在站点上注册一个本地帐户,这样他以后就可以使用该帐户登录他在站点上的帐户。
- 用户可以选择通过其他站点(“外部站点”)(例如 facebook connect、google、foursquare 等)登录,这将使他使用该站点登录他将来在网站上的帐户。
- 他选择哪种登录方法( native 帐户或外部站点帐户)并不重要,用户将能够通过外部站点(例如 facebook、twitter)在站点上验证他的帐户、instagram 等...),用于在网站.
我应该如何设计数据库的架构?
对于前两个场景,我想到了一个名为 Users
的表,它有一个 id
和一个 type
字段。该类型引用不同的表,例如 FacebookUsers
或 GoogleUsers
,每个表都有一个 user_id
字段 - 它与 有外部关系Users.id
字段 - 以及其他字段,例如 first_name
、profile_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/