【问题标题】:User Settings/Privacy Database Design用户设置/隐私数据库设计
【发布时间】:2011-08-28 23:37:21
【问题描述】:

我正在使用 PHP 和 MySQL 开发一个网站,用户可以选择以下选项:

  • 通过电子邮件接收通知
  • 隐藏/显示 Facebook/Twitter 链接

它还将允许用户控制他们的个人资料的隐私,包括对朋友/非朋友可见的信息以及哪些朋友可以查看某些照片/相册。

我想知道如何将这张表设计得更健壮,以及我应该考虑哪些事项。出于好奇,Facebook 如何管理每个用户的隐私设置和选项?

到目前为止,我的解决方案是这样的:

id - 主键

member_id - 主键和外键(成员表 'id')

facebook_viewable - int(1) - 0 表示否,1 表示是

email_notifications - int(1) - 0 表示否,1 表示是

【问题讨论】:

  • 请写一个和facebook的twitter无关的网站。
  • 不相关,但你想要的是 tinyint,而不是 int。最后的 (1) 不会影响数据的大小,因此那些 0 和 1 仍然会占用与 int 一样多的空间。这是一个常见的误解。

标签: php mysql database database-design


【解决方案1】:

首先,如果idmember_id 都是主要的,您可能不需要同时拥有它们。你真的需要member_id,所以你可以放弃另一个id

为了稳健,您需要将设置驱动到行而不是列中。从数据库的角度来看,追加行比修改表来增加列要容易得多。

您需要的是一个包含隐私规则类型列表的表,然后是成员表和隐私规则类型表之间的交集表。架构将是这样的:

MEMBER
  id int not null PRIMARY KEY
, name nvarchar(50)...
, (and so forth)

PRIVACY_RULE
  id int not null PRIMARY KEY
, rule_description  nvarchar(50)

MEMBER_PRIVACY
  member_id int not null
, privacy_rule_id int not null
, rule_value tinyint
, PRIMARY KEY (member_id, privacy_rule_id)

这样,隐私规则 ID 在您的应用程序代码中变为常量,用于以编程方式强制执行实际规则,并且可以轻松地将值添加到交集表中。当您发明新的隐私规则时,您只需将一条记录插入 PRIVACY_RULE,然后更改您的应用程序代码。无需更改数据库架构。

请注意,可以对相同的基本结构进行详细说明,使其更加灵活。例如,除了二进制标志之外,您可以有许多不同类型的值,并且您可以使用PRIVACY_RULE 表上的附加“rule type”属性来控制这些值的解释。我不想在这个话题上走得太远,所以如果你想了解这方面的更多细节,请告诉我。

【讨论】:

  • 很酷的东西,你会如何处理“谁可以看到我的照片:所有人 | 朋友 | 自定义”?
  • 正如我在回答中开始提到的那样,如果您愿意,可以很容易地将“rule_value”从位标志扩展到枚举。这可以处理多值设置,例如任何人|朋友|朋友的朋友等等。您也可以通过将规则应用于成员拥有的对象来进行自定义。这将需要另一个看起来像 MEMBER_PRIVACY 的表,但其中包含对象的 FK(照片/页面/...)
猜你喜欢
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多