想象一个带有一组复选框的web表单(可以选择其中任何一个或所有复选框)。我选择将它们保存在一个以逗号分隔的值列表中,这些值存储在数据库表的一列中。
现在,我知道正确的解决方案是创建第二个表并正确地规范化数据库。它可以更快地实现简单的解决方案,并且我希望快速地对该应用程序进行概念验证,而不必在其上花费太多时间。
我认为在我的情况下,节省的时间和更简单的代码是值得的,这是一个合理的设计选择吗,还是我应该从一开始就将其规范化?
更详细地说,这是一个小型的内部应用程序,本质上是替换存储在共享文件夹中的Excel文件。我问这个问题也是因为我正在考虑清理程序并使其更易于维护。书中有些东西我不是很满意,其中之一就是这个问题的主题。
我需要一个多值列,它可以实现为一个xml字段
它可以转换为必要时分隔的逗号
使用Xquery在sql server中查询XML列表。
通过作为xml字段,可以解决一些问题。
使用CSV:不能确保每个值都是正确的数据类型:没有办法防止1,2,3,banana,5
使用XML:标签中的值可以强制为正确的类型
CSV:不能使用外键约束将值链接到查找表;没有办法强制引用完整性。
对于XML:仍然是一个问题
CSV:不能强制唯一性:没有办法防止1,2,3,3,3,5
对于XML:仍然是一个问题
使用CSV:不能在不获取整个列表的情况下从列表中删除值。
使用XML:可以删除单个项
使用CSV:很难搜索列表中给定值的所有实体;你必须使用低效的表格扫描。
使用XML: XML字段可以被索引
使用CSV:很难计数列表中的元素,或执行其他聚合查询
使用XML:不是特别难
使用CSV:很难将值连接到它们引用的查找表中
使用XML:不是特别难
使用CSV:很难按顺序获取列表。
使用XML:不是特别难
使用CSV:将整数存储为字符串所占用的空间大约是存储二进制整数的两倍。
使用XML:存储甚至比csv还要糟糕
CSV:加上很多逗号字符。
在XML中:使用标记代替逗号
简而言之,使用XML解决了带分隔符列表的一些问题,并且可以根据需要将其转换为带分隔符列表