使用JDBC设计数据库表

时间:2010-06-13 18:36:23

标签: database-design jdbc

我正在使用JDBC和mysql创建一个用户表,每个用户都有一个包含整数值的权限列表。

我想知道是否应该使用数组存储这些值,然后在表中只有1个用户记录,或者只是创建一个包含2列的新表:用户ID和权限,然后有多个记录为每个用户指定一列中的用户名和第二列中的一个权限值。

第二个选项似乎是多余的,因为权限值是一个与任何其他对象无关的简单对象(例如学生和课程列表,因为该课程与许多其他对象相关联,如年级,老师等等,所以在这种情况下很自然会有多个记录),但第一个似乎对我来说有点不自然,所以如果有人有这些东西的经验并且可以指导我进行“自然”设计? 感谢

3 个答案:

答案 0 :(得分:2)

如果您想为单个用户存储多个权限,我会正确使用三个表。一个用户,一个用于权限。在单个属性(例如逗号分隔)中存储多个信息是不好的设计。存储多个信息会给你很多限制。

  1. 无法对属性合理排序
  2. 无法使用该属性来连接表格
  3. 可能更多
  4. 用户

    ID用户所
    名称

    许可

    idPermission
    许可

    userPermission

    ID用户所
    idPermission

答案 1 :(得分:2)

  

“这不是我所需要的,就像我说的那样,   permission只是一个整数值   (没有名字或身份证)。我想要一个答案   这可以引导我完成我的问题   方式“

考虑以下陈述

  • 用户noona拥有权限5,6和7
  • 用户apc拥有权限1和9

哪个用户更强大?用户noona可以使用权限5,6和7执行哪些操作?这些权限意味着什么

如果不存储名称或标识符,则数据的含义存在于数据库之外。有时这是有效的,但通常它是一个糟糕的设计决策的指标。这就是为什么每个人都在推动Permissions表和UserPermissions作为它与用户之间的交集表。

有一个单独的UserPermissions表是正确的选择(不论你在何处存储权限的意思),因为具有值一列可以很容易地找到谁有权4或查询是否用户{{1}的所有用户有权限7.

无论如何,数组都不自然。

答案 2 :(得分:1)

如果你发现自己想要在列中存储逗号分隔的列表(或任何分隔符),这是一个非常强烈的提示,你应该使用另一个表(实际上是两个,因为你拥有的是你有很多很多关系)。不这样做会打破正常化。

话虽如此,我已经看到(旧)系统将权限列表存储为“权限掩码”(例如'101101')。但我认为这是一种不好的做法,违背了上述规则并且没有一个好的论据来证明它的合理性(除了你避免加入......如果你不做其中的7个以上这不是问题)