sql - 在 SQL 数据库中存储 "list"的最正确方法是什么?

标签 sql sql-server database database-design

所以,我读了很多关于将多个值存储到一个列中是一个坏主意并且违反了数据规范化的第一条规则(令人惊讶的是,这不是“不要谈论数据规范化”)所以我需要一些帮助。

目前我正在为我工​​作的地方设计一个 ASP .NET 网页。我想根据此人所属的 Active Directory 组在网页上显示数据。想到的第一种方法是创建一个表,基本上,一列包含 AD 组,第二列包含属于该列表的计算机列表。

我了解到这表现出对关系数据库的极大漠视,那么什么是更好的方法呢?我想通过 SQL 表控制这种访问,因此我可以从这些表中添加/删除并相应地更改最终用户访问。

感谢您的帮助! :)

编辑:准确描述我想做的是:

我们有一组特定的计算机需要检查,但是这些计算机位于物理上难以到达的位置。我所在的组织为这些计算机启用了远程控制,但是他们不提供远程控制密码(可以理解)。

增加的复杂性是,根据您的身份,我们的客户应该只能看到特定的计算机组(即他们所在地区拥有的计算机组)。因此,如果 A 组中有 Thomas,而 B 组中有 Jones,如果您属于任一组,那么您只会看到一个条目。但是,如果您属于两个 组,您应该在其中看到两个 Thomas 和 Jones 计算机。

我认为将这些数据存储在 SQL 单元格中的原因是,将它们存储在表中需要(在我看来)为每个新的计算机“组”创建一个新表。我不想为每个新组创建 SQL 表,我更愿意在 SQL 表的某处添加一行。

这有什么意义吗?

最佳答案

在 SQL Server 中基本上有三个选项:

  • 将值存储在单个列中。
  • 将值存储在联结表中。
  • 将值存储为 XML(或其他一些结构化数据格式)。

(其他数据库还有其他选择,比如数组、嵌套表、JSON。)

几乎在所有情况下,使用联结表都是正确的方法。为什么?以下是一些原因:

  • SQL Server 有(相对)糟糕的字符串操作,所以做一些像确保唯一列表这样简单的事情真的非常非常困难。
  • 联结表允许您存储许多其他信息(何时添加机器?机器的完整描述是什么?等等)。
  • 您想要的大多数查询都非常容易使用联结表(唯一的异常(exception)是获取逗号分隔列表,唉——这只是违反直觉而不是“困难”)。
  • 所有类型都本地存储。
  • 联结表允许您对列表的元素强制执行约束(检查和外键)。

虽然定界列表几乎不是正确的解决方案,但可以想到它可能有用的情况:

  • 列表不变,列表的呈现非常重要。
  • 空间使用是一个问题(唉,非规范化通常会导致页面变少)。
  • 查询并不真正访问列表的元素,只是整个列表。

在某些情况下,XML 也是一个合理的选择。在最新版本的 SQL Server 中,这可以变得非常高效。但是,它会产生读取和解析 XML 的开销——而且诸如重复消除之类的事情仍然不明显。

因此,您确实有多种选择。在几乎所有情况下,联结表都是正确的方法。

关于sql - 在 SQL 数据库中存储 "list"的最正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35493577/

相关文章:

sql - JOIN 中表的顺序

javascript - 我正在进行在线测试,一切都完成了。但我的自动提交计时器不起作用。

c# - 多列插入中的默认命令参数

php - 我可以从 MySQL 读取 SQL Server 中的表吗?

sql-server - 在 SQL Server 中将行转换为 XML 格式

database - 如何过滤和计算typeorm中的关系项?

database - 如何将 CSV 文件导入两个相关的 PostgreSQL 表?

java - IDE 错误 JDBC java

sql - 替换字符串 SQL

python - MySQL插入一个条目,其中值的数量<列数