什么时候将标志存储为位掩码比使用关联表更好?

2023-12-26

我正在开发一个应用程序,其中用户具有不同的权限来使用不同的功能(例如读取、创建、下载、打印、批准等)。权限列表预计不会经常更改。我有几个选项可以选择如何将这些权限存储在数据库中。

在什么情况下选项 2 会更好?

Option 1

使用关联表。



User
----
UserId (PK)
Name
Department
  

Permission
----
PermissionId (PK)
Name  

User_Permission
----
UserId (FK)
PermissionId (FK)  

Option 2

为每个用户存储一个位掩码。


User
----
UserId (PK)
Name
Department
Permissions  
[Flags]
enum Permissions {
    Read = 1,
    Create = 2,
    Download = 4,
    Print = 8,
    Approve = 16
}

很好的问题!

首先,让我们对“更好”做一些假设。

我假设您不太关心磁盘空间 - 从空间的角度来看,位掩码是有效的,但我不确定如果您使用 SQL Server,这是否重要。

我假设您确实关心速度。使用计算时,位掩码可以非常快 - 但在查询位掩码时您将无法使用索引。这应该不那么重要,但是如果您想知道哪些用户具有创建访问权限,您的查询将类似于

select * from user where permsission & CREATE = TRUE

(今天在路上无法访问 SQL Server)。由于数学运算,该查询将无法使用索引 - 因此如果您有大量用户,这将非常痛苦。

我假设您关心可维护性。从可维护性的角度来看,位掩码不如存储显式权限那样具有底层问题域的表达能力。您几乎肯定必须跨多个组​​件(包括数据库)同步位掩码标志的值。不是不可能,只是后背疼痛。

因此,除非有另一种评估“更好”的方法,否则我认为位掩码路由不如将权限存储在规范化的数据库结构中好。我不同意它会“变慢,因为你必须进行连接” - 除非你有一个完全功能失调的数据库,否则你将无法测量这一点(而没有活动索引的好处的查询可能会变得明显即使有几千条记录也会更慢)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候将标志存储为位掩码比使用关联表更好? 的相关文章

随机推荐

  • 使用 TypeScript 2.0 导入 js 文件

    Abstract 我正在尝试从外部位置导入 js 文件 即节点模块 我正在尝试使用 commonjs 模块模式来做到这一点 但是import不想使用 js 文件类型 直到我在同一文件夹中的 js 文件附近添加 d ts 文件 但问题是我不想
  • 使用 NestJS 基于模式获取多个 Redis 缓存键

    目前我已经创建了一个带有 Redis 缓存的 NestJS 应用程序 我希望能够通过使用一种模式从 Redis 缓存中获取多个键 在该模式中我可以获得包含某个字符串的所有键 目前我正在使用缓存管理器 and 缓存管理器 redis 存储作为
  • 如何将位图图像设置为按钮背景图像

    gridcell Button row findViewById R id calendar day gridcell gridcell setText Day 1 URL url new URL http 172 16 4 29 81 p
  • 如何使用文本框值过滤多项选择中的值

    我有一个文本框和多个选择框 当我在文本框中写入内容时 它会在多重选择中过滤该文本并仅显示匹配的值
  • IntelliJ 的“重新导入所有 Maven 项目”按钮如何工作?

    IntelliJ 的 重新导入所有 Maven 项目 按钮实际上是如何工作的 我问这个是因为我看到 IntelliJ 重新导入按钮的行为是不同的比运行mvn命令与 U争论 我不清楚为什么 我认为您错过了本地和远程存储库的部分 如果你跑mvn
  • 如何将numpy数组中的元素随机设置为0

    首先我创建我的数组 myarray np random random integers 0 10 size 20 然后 我想将数组中 20 的元素设置为 0 或其他数字 我该怎么做 敷面膜吗 您可以使用以下方法计算指数np random c
  • Mysql 全文搜索不支持特殊字符

    问题 我使用的是 MYSQL 和 PHP 最新版本 我们在 MYSQL FULLTEXT 搜索中面临这个问题 它不适用于特殊字符 示例 在域表中 名称 字段具有以下三个值 1 https www google com 2 https www
  • XMLDocument.Importnode 失败

    我目前正在开发一个项目 我必须创建 XMLNode 并将它们插入 XML 文件中的特定位置 XMLNode 是一个包含大约 90 个单元的行
  • 经验丰富的 C++ 开发人员快速切换到 Java [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找在线教程 书籍 这些教程 书籍假定对 OOP 设计模式概念有扎实的了解 并强调 C 和 Jav
  • 使文本行具有相等的长度

    居中h1文本的元素落在多行上 换行符使文本看起来像这样 This is a header that takes up two lines This is a header that takes up three lines because
  • std::vector::assign - 重新分配数据?

    我正在使用 STL 库 我的目标是尽量减少数据重新分配的情况 我想知道 是吗 std vector assign size type n const value type val 如果大小未更改或实际上只是分配新值 例如 使用operato
  • 将 C++ 函数指针分配给同一对象的成员函数

    如何让 test calculate 中的函数指针分配 也许还有其余部分 发挥作用 include
  • 初始化元素并一键开始拖动

    At mousedown我想在 DOM 中注入一个新元素并立即开始拖动它 即触发dragstart 无需再次单击新元素 我在我的项目中经常使用 d3 js 但不知道能不能触发dragstart使用 d3 事件 所以我尝试使用 jQuery
  • Django 管理员不处理 ProtectedError 异常

    我有一个 Django 应用程序 它的模型如下 class Foo models Model name models CharField max length 100 我在此模型中有一个特定实例 其名称为 bar 例如 我想防止删除该实例
  • 如何将 DataFrame 附加到多索引 DataFrame?

    假设我有 DataFrame In 1 a pd DataFrame 1 2 3 4 5 6 7 8 index pd MultiIndex from product A B d e In 2 a Out 2 0 1 A d 1 2 e 3
  • Xcode 崩溃后总是停在 main.m

    过去 使用旧的 良好的 Xcode 3 每次崩溃时 Xcode 都会停在显示崩溃的有问题的行处 这是美好的时光 很高兴调试 现在使用 Xcode 4 2 每次应用程序崩溃时 它都会停在 main m 的这一行 int retVal UIAp
  • 如何在Jaspersoft Studio中制作带有动态列的表格? [复制]

    这个问题在这里已经有答案了 我需要在 Jaspersoft Studio 中制作这张表 我的桌子有时有一个测试 两个 n 个测试或什么都没有 是否可以 我该如何解决这个任务 您无法在 jasper 中动态创建列 但在创建一些固定数量的列后
  • Android 开始屏幕上使用的手势

    使用什么 Android Api 来在 Android 上的开始屏幕上向左或向右滚动 最简单的方法是检测 Fling 手势 Android API 有一个内置的检测器 用于基本手势 如快速滑动 滚动 长按 双击 捏合缩放等 该文档位于htt
  • Mix.exs 文件更改 - (SyntaxError) mix.exs:65: 意外标记:“”(第 1 列,代码点 U+0000)

    保存所做的任何更改mix exsMac OS High Sierra 10 13 6 上的文件会导致文件开头处出现空字符 我最初是针对 intellij elixir 插件打开的 但问题是使用任何文本编辑器 sublime vim inte
  • 什么时候将标志存储为位掩码比使用关联表更好?

    我正在开发一个应用程序 其中用户具有不同的权限来使用不同的功能 例如读取 创建 下载 打印 批准等 权限列表预计不会经常更改 我有几个选项可以选择如何将这些权限存储在数据库中 在什么情况下选项 2 会更好 Option 1 使用关联表 Us