想象一个带有一组复选框的Web表单(可以选择任何一个或全部)。 我选择将它们保存在数据库表的一列中以逗号分隔的值列表中。
现在,我知道正确的解决方案是创建第二个表并正确规范化数据库。 实施简单的解决方案的速度更快,我想快速对该应用程序进行概念验证,而不必花费太多时间。
我认为节省时间和简化代码在我的情况下是值得的,这是一个合理的设计选择,还是我应该从一开始就对其进行标准化?
在更多情况下,这是一个小型内部应用程序,实际上替代了存储在共享文件夹中的Excel文件。 我也在问,因为我正在考虑清理程序并使其更易于维护。 我有些不满意,有些是这个问题的主题。
#1楼
我需要一个多值列,它可以实现为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可以解决定界列表的一些问题,并且可以根据需要将其转换为定界列表
#2楼
是的,我会说那真的很糟糕。 这是一个合理的选择,但这并不能使它正确或良好。
它破坏了第一范式。
第二种批评是,将原始输入结果直接放入数据库中,而无需进行任何验证或绑定,这使您容易受到SQL注入攻击的影响。
您所说的懒惰和缺乏SQL知识就是新手制造的东西。 我建议花些时间正确地做它,并将其视为学习的机会。
或者保持原样,并学习有关SQL注入攻击的痛苦教训。
#3楼
好吧,我已经在SQL Server的NTEXT列中使用键/值对选项卡分隔的列表了4年多了,它可以正常工作。 您的确失去了进行查询的灵活性,但是,另一方面,如果您拥有一个持久存储/持久化键值对的库,那么这并不是一个坏主意。
#4楼
因此有很多问题要问:
- 如何从逗号分隔的列表中获取特定值的计数
- 如何从该逗号分隔的列表中获取仅具有相同的2/3 / etc特定值的记录
逗号分隔列表的另一个问题是确保值的一致性-存储文本意味着可能出现拼写错误...
这些都是非规范化数据的症状,并突出说明了为什么应该始终为规范化数据建模。 非规范化可以是查询优化, 可以在需求实际出现时应用 。
#5楼
我可能会采取中间立场:将CSV中的每个字段放入数据库中的单独列中,但不必担心规范化(至少目前如此)。 在某些时候,规范化可能会变得很有趣,但是将所有数据推到一个单独的列中,使用数据库几乎没有任何好处。 您需要先将数据分为逻辑字段/列/任何要调用的内容,然后才能进行有意义的操作。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3186460