【问题标题】:Storing user permissions on rows of data存储用户对数据行的权限
【发布时间】:2017-01-27 09:40:05
【问题描述】:

我有一个表格,其中包含用于不同实验的数据行。

experiment_id    data_1    data_2
-------------    ------    -------
      1
      2
      3
      4
     ..

我在 django 上有一个用户数据库,我想存储指示哪些用户可以访问哪些行的权限,然后只返回用户被授权的行。

我应该使用什么格式来存储权限?只是一个表格,每个用户都有一行,每个实验用布尔值有一列?在那种情况下,每次添加实验时我都必须在此表中添加一行?

user    experiment_1    experiment_2    experiment_3    ..
----    ------------    ------------    ------------    --
user_1     True             False          False        ..
user_2     False            True           False        ..
 ..

任何关于该主题的参考文献也很好,最好与 sqlite3 功能相关,因为这是我当前的数据库后端。

【问题讨论】:

  • 我不会为每个实验添加列。但这就是我。请参阅Junction Tables 忽略 csv 部分。其余适用
  • 您是否尝试过查看涉及“交叉引用表”的解决方案? IE。表“实验”、“用户”、“User_Experiment_Permission”?
  • 你需要了解database normalization。这应该指导您的最终设计:提示:您提出的建议将起作用,但将是维护的噩梦。

标签: python mysql django database sqlite


【解决方案1】:

我不能 100% 确定哪种方法最适合您,但过去我发现使用以下解决方案是最容易在未来查询和维护的解决方案。

Table: Experiment
Experiment_Id  |  data_1  |  data_2
-----------------------------------
 1             |  ...     |  ...
 2             |  ...     |  ...

Table: User
User_Name  | Password  | ...
----------------------------
 User1     | ...
 User2     | ...

Table: User_Experiment_Permissions
User_Name | Experiment | Can_Read | Can_Edit
--------------------------------------------
 User1    | 1          | true     | false
 User2    | 1          | false    | false
 User1    | 2          | true     | true
 User2    | 2          | true     | false

如您所见,在新表中,我们同时引用了用户和实验。这使我们能够对用户和实验之间的关系进行细粒度控制。此外,如果这种关系产生了新的权限,例如can_delete,那么您可以简单地将其添加到新的交叉引用表中并使用默认值,并且更改将被改造到您的系统中:-)

【讨论】:

  • 我认为这种方式不会扩展,对少量用户和权限有好处,但是如果这个表有大量用户和权限,这将很难更新,删除记录
  • @AmrMagdy 这可能是真的。我们真的不知道 OP 的规模/性能要求是什么。软件要大规模运行,总是需要考虑和优化。感谢您指出考虑!
  • 我认为这是一个比我在问题中提出的更优雅的解决方案。问题更多的是使用适当的约定而不是可行的方法。可扩展性不是一个大问题,我猜最多会有 100 个用户和 100 个实验。
  • @AmrMagdy 它不能扩展怎么办?架构被规范化(可能除了data_# 列)并且大多数 RDBMS 的规模都可以很好地扩展到数百万行。
【解决方案2】:

这取决于您使用权限的方式。

- 如果您将在查询中使用此值 例如,您有两种选择来获得具有特定权限的用户

  • 创建一个bit masking 数字字段,每个位都代表权限,您可以使用AND/OR 来获得所需的任何权限组合。
    • 优点:体积小,效率高
    • 缺点:实施复杂
  • 为每个权限创建一个字段(您的解决方案)。
    • 优点:添加方便
    • 缺点:必须使用每个权限编辑架构


- 如果您不会将它用于任何查询并在代码中处理它,您可以将 JSON 转储到一列中,包括用户拥有的所有权限,例如:

{"experiment_1": 1, "experiment_2": 0, "experiment_3": 1}

【讨论】:

  • JSON 方法正是我想做的。我有一个表,主键是用户名,权限列是 JSON blob。唯一的问题是我必须解析 json 字符串,生成一个包含所有实验 ID 的元组,然后进行 SQL 调用。所以这将是两个调用,中间有一些 python 开销。我担心虽然这个词很容易实现,但它不会很好地扩展。
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 2012-03-14
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 2019-01-30
  • 2021-03-26
相关资源
最近更新 更多