Mysql 表行或列

Mysql 表行或列,mysql,sql,Mysql,Sql,我有一个项目,需要我设置自定义权限,分为三类“管理员、经理、用户” 我的常规方法是在一个表中以标题形式分发权限,然后为每个类别添加一个0或1的原始权限,以激活或停用组的权限,如下所示: id|name|can_do_this|can_do_that 1|admin|1|1 2|manager|1|0 3|user|0|0 id|user_id|privilege|active 1,1,can_do_this,1 2,1,can_do_that,1 3,2,can_do_this,1 4,2,c

我有一个项目,需要我设置自定义权限,分为三类“管理员、经理、用户” 我的常规方法是在一个表中以标题形式分发权限,然后为每个类别添加一个0或1的原始权限,以激活或停用组的权限,如下所示:

id|name|can_do_this|can_do_that
1|admin|1|1
2|manager|1|0
3|user|0|0
id|user_id|privilege|active
1,1,can_do_this,1
2,1,can_do_that,1
3,2,can_do_this,1
4,2,can_do_that,0
但是,我的教授要求每个用户单独添加每个权限,每个组不添加,如下所示:

id|name|can_do_this|can_do_that
1|admin|1|1
2|manager|1|0
3|user|0|0
id|user_id|privilege|active
1,1,can_do_this,1
2,1,can_do_that,1
3,2,can_do_this,1
4,2,can_do_that,0
我的问题,为了我的理智。。哪个更有效?他的观点是,如果我们需要添加一个新的特权,我们不需要修改表来添加一个新的列。
希望这个问题有意义。

对我来说,这是一个非常简单的数据建模问题。数据模型中有两个“实体”:

  • 使用者
  • 特权
这意味着每个人都应该有自己的桌子

因为这是一个多对多关系(许多用户可以拥有给定的权限,一个用户可以拥有多个权限),所以第三个表通常用于表示该关系;这通常被称为“连接表”或“关联表”

您的教授给出了一个很好的理由来表示行而不是列中的值:添加新特权的能力

我可以补充几点:

  • userPrivileges
    表可以有一个
    createdOn
    列,以便您知道特权何时生效
  • userPrivileges
    可以有一个
    createdBy
    列,这样您就知道是谁授予了特权
  • userPrivileges
    表可以有一个
    suspended
    列,因此您可以临时挂起特权

  • 对我来说,这是一个非常简单的数据建模问题。数据模型中有两个“实体”:

    • 使用者
    • 特权
    这意味着每个人都应该有自己的桌子

    因为这是一个多对多关系(许多用户可以拥有给定的权限,一个用户可以拥有多个权限),所以第三个表通常用于表示该关系;这通常被称为“连接表”或“关联表”

    您的教授给出了一个很好的理由来表示行而不是列中的值:添加新特权的能力

    我可以补充几点:

    • userPrivileges
      表可以有一个
      createdOn
      列,以便您知道特权何时生效
    • userPrivileges
      可以有一个
      createdBy
      列,这样您就知道是谁授予了特权
    • userPrivileges
      表可以有一个
      suspended
      列,因此您可以临时挂起特权

      • 我建议你选第二个,因为就像你老师说的那样,你不需要改变桌子。更改表意味着为表中的每个成员添加一个新的1或0(可以使用默认值,但仍需要更改需要该权限的用户的值)

        你的老师说你可以拥有另一个拥有所有特权的表,并使用外键

        通过这种方式,您可以添加一个新的特权,并使用默认值“1”将其分配给他们需要的用户,如果您需要撤销该特权,则将其更改为“0”。默认情况下不会添加不必要的行,这在小表中不是问题,但在大表中却是问题

        id  |user_id   |privilege   |active
        1      1        can_do_this    1
        2      1        can_do_that    1
        3      2        can_do_this    1
        4      2        can_do_that    0
        

        我建议你选第二个,因为就像你老师说的那样,你不需要改变桌子。更改表意味着为表中的每个成员添加一个新的1或0(可以使用默认值,但仍需要更改需要该权限的用户的值)

        你的老师说你可以拥有另一个拥有所有特权的表,并使用外键

        通过这种方式,您可以添加一个新的特权,并使用默认值“1”将其分配给他们需要的用户,如果您需要撤销该特权,则将其更改为“0”。默认情况下不会添加不必要的行,这在小表中不是问题,但在大表中却是问题

        id  |user_id   |privilege   |active
        1      1        can_do_this    1
        2      1        can_do_that    1
        3      2        can_do_this    1
        4      2        can_do_that    0
        

        根据我的经验,如果你不想每次在应用程序中需要更新新权限时都添加额外的列。然后选择第二个选项

        好处: 选项1:组将没有冗余数据,并且可以轻松管理,因为您可以对组名应用唯一约束,因此不需要每次插入

        选项2:您不需要添加alter表,您只需验证新权限是否已存在,如果不存在,则只需添加新的insert或更新现有权限即可

        不利条件: 选项1:每当新权限出现时,您都需要更改表


        选项2:每当您要为组添加新权限时,首先必须确定记录是否已存在,然后必须插入到表中。与第一个选项相比,验证该选项也有点复杂

        因此,两者都有其优点和缺点。如果您从数据冗余的角度考虑,那么选择选项1,否则选择选项2

        据我所知,我更愿意使用选项1,我将要做的只是维护一个额外的表,该表标识它们之间的权限和物理列,并且我将使其通用


        好的

        根据我的经验,如果你不想每次在应用程序中需要更新新权限时都添加额外的列。然后选择第二个选项

        好处: 选项1:组将没有冗余数据,并且可以轻松管理,因为您可以对组名应用唯一约束,因此不需要每次插入

        选项2:您不需要添加alter表格,您只需验证新权限是否已存在,如果不存在,则只需添加新的insert或更新existin即可