在SQL数据库中存储"列表"的最正确方法是什么?

Lew*_*nci 5 sql database sql-server database-design

所以,我已经阅读了很多关于如何将多个值存入一列是一个坏主意并违反数据规范化的第一条规则(令人惊讶的是,它不是"不要谈论数据规范化")所以我需要一些帮助.

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

我已经了解到这显然忽略了关系数据库,那么更好的方法是什么呢?我想通过SQL表来控制这种访问,因此我可以在这些表中添加/删除并相应地更改最终用户访问权限.

谢谢您的帮助!:)

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

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

增加的复杂性是,根据您的身份,我们的客户应该只能看到某组计算机(即他们所在地区拥有的计算机组).所以,如果A组中有Thomas,而B组中有Jones,那么如果你属于任何一个组,那么你只会看到一个条目.但是,如果你属于这两个群体,你应该看到两个在它托马斯和琼斯的电脑.

我认为将这些数据存储在SQL单元中的原因是,将它们存储在表中需要(在我看来)为每个新的"组"计算机创建一个新表.我不想为每个新组创建SQL表,我更倾向于在某个SQL表中添加一行.

这有意义吗?

Gor*_*off 7

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

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

(其他数据库有其他选项,例如数组,嵌套表和JSON.)

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

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

虽然分隔列表几乎不是正确的解决方案,但可以考虑它可能有用的情况:

  • 列表不会更改,列表的显示非常重要.
  • 空间使用是一个问题(唉,非规范化通常会导致更少的页面).
  • 查询并不真正访问列表的元素,只是整个事物.

在某些情况下,XML也是一个合理的选择.在最新版本的SQL Server中,这可以非常高效.但是,它会导致读取和解析XML的开销 - 而重复消除等问题仍然不明显.

所以,你有选择权.几乎在所有情况下,联结表都是正确的方法.


Web*_*erP 0

听起来您想要一个将用户映射到组 ID 的表,以及另一个将组 ID 映射到该组中的计算机的表。我不确定,你描述问题的语言让我有点困惑。