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

时间:2016-02-18 22:18:53

标签: sql sql-server database database-design

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

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

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

感谢您的帮助! :)

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

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

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

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

这有意义吗?

7 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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

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

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

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

答案 1 :(得分:1)

在一个列中存储多个值并不是一个坏主意,但这取决于您想要的搜索。

如果您只是想知道属于某个群体的人员,那么您可以将人员存储在一个列中,并将组ID作为密钥。对于更新,您只需更新组中的整个列表。

但是,如果您要搜索属于组的指定人员,则不建议您将此多个人存储在一列中。在这种情况下,最好存储一个存储人员ID和组ID的itermedium表。

答案 2 :(得分:0)

听起来好像你想要一个将用户映射到组ID的表,以及一个映射组ID到该组中的计算机组的第二个表。我不确定,你描述问题的语言对我来说有点混乱。

答案 3 :(得分:0)

列表中包含以下列:名称,姓氏,电话号码等。 和name这样的行= john familyName = lee number = 12321321 name = ... familyname = ... number = ...

一个sql数据库的工作方式相同。 sql数据库中的每一行都是一条记录。因此,您可以使用插入查询将列表的记录添加到数据库中。 这里有完整的解释: http://www.w3schools.com/sql/sql_insert.asp

答案 4 :(得分:0)

你应该考虑“它取决于”。如果永远不会查询(或很少查询)数据,那么将其存储为XML或JSON将是完全可以接受的。许多DBA会吓坏,但是要获取要发送给客户端的数据blob要比从辅助表中重构和分解一组列要快得多。 (文档和对象数据库变得如此受欢迎是有原因的。)

...虽然我会问你为什么要将活动目录复制到你的数据库中,你打算如何保持这些同步。

答案 5 :(得分:0)

这听起来像一个典型的many-to-many problem。你有许多组和许多计算机,它们彼此相关。在这种情况下,通常建议使用映射表,即“联结表”或“交叉引用”表。此表仅包含其他表中的两个外键。

如果您的表格如下:

Computer
- computerId
- otherComputerColumns

Group
- groupId
- othergroupColumns

然后您的映射表将如下所示:

GroupComputer
- groupId
- computerId

您可以为组和计算机之间的每个关系插入一条记录。这符合third normal form关于数据库规范化的规则。

答案 6 :(得分:0)

您可以拥有一个包含组和组ID的表,另一个包含计算机和计算机ID的表以及一个包含组ID和计算机ID关系的第三个表。