Mysql 如何在数据库中实现这种逻辑?

Mysql 如何在数据库中实现这种逻辑?,mysql,database-design,normalization,Mysql,Database Design,Normalization,情况如下: 我有一个“用户”,它有很多属性。例如,“姓名”、“电子邮件”、“密码”、“电话” 有一些属性是公开的,例如“名称”、“电子邮件”。 这些信息对访问该网站的evenbody开放 但也有一些,仅用于系统中的信任主体,如“电话”。 这些信息对用户信任的人开放。。。。(假设用户有一个信任列表,可以接受其他用户加入该信任列表。) 私人密码。 此信息仅供用户使用,其他人无法访问 用户可以根据自己的需要更改不同的安全级别,例如,用户希望更改“电子邮件”的唯一可信主体,他们可以这样做。它还允许用户将

情况如下: 我有一个“用户”,它有很多属性。例如,“姓名”、“电子邮件”、“密码”、“电话”

有一些属性是公开的,例如“名称”、“电子邮件”。 这些信息对访问该网站的evenbody开放

但也有一些,仅用于系统中的信任主体,如“电话”。 这些信息对用户信任的人开放。。。。(假设用户有一个信任列表,可以接受其他用户加入该信任列表。)

私人密码。 此信息仅供用户使用,其他人无法访问

用户可以根据自己的需要更改不同的安全级别,例如,用户希望更改“电子邮件”的唯一可信主体,他们可以这样做。它还允许用户将其“手机”更改为公用

我用三个数字来表示三级权利。第一个是3,第二个是2,私人是1。因此,我以这种方式设计数据库:

User
id(PK) 
nameId(FK) 
emailId(FK) 
passwordId(FK) 
phoneId(FK)

Name:
id(PK)
name(String)
securityLevel(int)

Email:
id(PK)
email(String)
securityLevel(int)

Phone:
id(PK)
phone(int)
securityLevel(int)

Password:
id(PK)
password(String)
securityLevel(int) //It must be 1

问题是,我可以这样做,但我的数据库将有许多表,有没有简单的方法来做到这一点?此外,有没有关于这种数据库设计的书籍被推荐?谢谢。

是否将私有数据隔离到单独的表中并不能解决如何防止未经授权的访问的问题。MySQL 5.1手册讨论了请求验证/权限,但如果数据库隐藏在web应用程序后面,无法直接访问表,那么仅标准web服务器安全性就足够了。您可能应该提到您正在使用的整个os/server/db/语言包(LAMP、SAMP等),以便有人能为您的配置建议最佳的安全方案。

如果我理解正确,您可以将所有这些信息放在两个表中(用户和朋友),因为据我所知,使用少量查询获取较大的数据块比使用大量查询获取较小的数据块要高效得多。你会有这样的想法:

Users:
id
name
name_perm // 1, 2 or 3
email
email_perm // 1, 2 or 3
phone
phone_perm // 1, 2 or 3
password // Doesn't need permissions, always 1

Friends:
user_id
friend_id
当用户访问其他用户的页面时,首先检查每个字段的权限级别。如果找到级别2,您将查询
friends
表,并检查当前用户ID是否是正在查看其页面的用户的朋友。如果找到,用户是可信的,并且可以显示2级安全信息。至于1级安全性,它非常简单-仅在两个ID匹配时显示此信息


希望这有帮助。

您不需要使用不同的表,因为每个关系都是1-1关系


如果一个用户有多个电子邮件地址,那么您确实应该将电子邮件和安全级别放在不同的表中。但因为在这种情况下,每个用户正好有一封电子邮件、一个姓名、一个电话、一个密码——每个用户只有一个表和一行就可以了。

我从问题中得出结论,问题是允许用户自定义不同项目的安全级别,以及在何处存储这些信息。哎呀,你说得对。我已更正了我的答复,以反映这一要求。感谢您指出。CSV-ing friends显然是错误的-friends是唯一真正需要另一个表的字段,因此您可以编写联接并获取它们的SecurityLevel…这会严重失败:(-1.这种方法有很大的缺陷。请参阅Konerak和joe snyder的答案。这应该在前端处理。除非您允许用户对数据库进行“原始”sql访问,否则您应该在应用程序中处理这种访问规则。