情况如下: 我有一个“用户”,它有很多属性。例如,“姓名”,“电子邮件”,“密码”,“电话”。
有些属性是公开的,例如“name”,“email”。 这些信息对访问该网站的人都是开放的。
但有些,仅适用于系统中的信任机构,例如“电话”。 这些信息对用户信任的人开放....(假设用户有一个信任列表,可以接受其他用户到信任列表。)
私人一个“密码”。 此信息仅供用户使用,其他人无法访问该信息。
用户可以根据需要更改不同的安全级别,例如,用户只想为受信任的机构更改“电子邮件”,他们可以这样做。它还允许用户将他们的“电话”改为公开。
我使用三个数字代表三个权利级别。第一个是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
问题是,我可以做到但我的数据库会有很多表,有没有简单的方法呢?此外,是否有关于这类数据库设计的书籍被推荐?谢谢。
答案 0 :(得分:1)
您不需要使用不同的表格,因为每个关系都是 1-1关系。
如果用户有多个电子邮件地址,那么您确实应该将电子邮件和安全级别放在不同的表中。但是因为在这种情况下,每个用户只有1个电子邮件,1个名字,1个电话,1个密码 - 每个用户只需要一个表,每行1行。
答案 1 :(得分:0)
私有数据是否被隔离到单独的表中并不能解决如何防止未经授权的访问的问题。 MySQL 5.1手册section 5.4.5讨论了请求验证/权限,但如果您的数据库隐藏在Web应用程序后面而无法直接访问您的表,那么仅标准Web服务器安全性就足够了。你应该提到你正在使用的整个os / server / db /语言包(LAMP,SAMP等等),这样有人可以为你的配置建议最好的安全方案。
答案 2 :(得分:0)
如果我理解这一点,你可以简单地将所有这些信息放在两个表(用户和朋友)中,因为据我所知,与较小的块相比,获得更大的数据块的查询次数要高得多。有很多查询的数据。你会有这样的事情:
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匹配时才显示此信息。
希望这有帮助。