【发布时间】:2012-03-28 08:22:47
【问题描述】:
我正在尝试规范化数据库以保存用户名和密码,以及特定用户可以访问的网页。为了简单起见,这是我开始的,但我认为根据我拥有的 2 本书,“useraccess”表违反了规范化的第一条规则......
userpassword table(userid,username,userpassword)
useraccess table(userid, accesstopage0,accesstopage1,accesstopage2,accesstopage3)
显然 useraccess 表有失控的危险。我的问题是......解决这个问题的最佳方法是什么?到目前为止,这就是我想出的替换 useraccess 表的方法,但我想知道是否有更优雅的方法可以做到这一点:
useraccess(userid,useridsequence,pageid)
pages(pageid,pagename)
所以一个例子是......
userpassword table(userid,username,userpassword)
0, useralpha, jinx
1, userbravo, binx
2, usercharlie, jabber
然后使用 userid 和 useridsequence 作为复合键来保持完整性...
useraccess table(userid, useridsequence, pageid)
0, 0, 0
0, 1, 1
0, 2, 2
1, 0, 3
2, 0, 1
2, 1, 2
pages table(pageid,pagename)
0, page0.php
1, page1.php
2, page2.php
3, page3.php
所有这些似乎都比它需要的复杂得多,有没有更好的方法来做到这一点?
【问题讨论】:
-
序列号有什么用?加入真正需要的只是用户 ID 和页面 ID,但您可能会考虑使用人工 pk 来轻松管理关系。
-
顺便说一句,我希望您真的要在该表中存储 salted (and peppered) hash 而不是实际密码。
-
使用序列 id+userid 可以获得唯一的行。我正在使用 SHA512 哈希算法和加盐密码。我没有这么说是因为这更多的是关于 sql 而不是安全性。
-
您从用户 ID/页面 ID 的唯一性约束中得到相同的结果。实际上,在此表中的这两列上建立唯一索引是一个非常好的主意。
标签: sql normalization