想象一个带有一组复选框的web表单(可以选择其中任何一个或所有复选框)。我选择将它们保存在一个以逗号分隔的值列表中,这些值存储在数据库表的一列中。

现在,我知道正确的解决方案是创建第二个表并正确地规范化数据库。它可以更快地实现简单的解决方案,并且我希望快速地对该应用程序进行概念验证,而不必在其上花费太多时间。

我认为在我的情况下,节省的时间和更简单的代码是值得的,这是一个合理的设计选择吗,还是我应该从一开始就将其规范化?

更详细地说,这是一个小型的内部应用程序,本质上是替换存储在共享文件夹中的Excel文件。我问这个问题也是因为我正在考虑清理程序并使其更易于维护。书中有些东西我不是很满意,其中之一就是这个问题的主题。


当前回答

是的,有那么糟糕。我的观点是,如果你不喜欢使用关系数据库,那么寻找一个更适合你的替代方案,有很多有趣的“NOSQL”项目,它们具有一些非常高级的功能。

其他回答

是的,我想说真的很糟糕。这是一个合理的选择,但这并不意味着它是正确的或好的。

它打破了第一正规形式。

第二个批评是,将原始输入结果直接放入数据库,而根本不需要任何验证或绑定,这会使您容易受到SQL注入攻击。

你所谓的懒惰和缺乏SQL知识是新手的东西。我建议你花点时间好好做这件事,并把它看作一个学习的机会。

或者让它保持现状,吸取SQL注入攻击的痛苦教训。

我可能会采取中间立场:将CSV中的每个字段放到数据库中单独的列中,但不太担心规范化(至少目前如此)。在某些情况下,规范化可能会变得很有趣,但如果将所有数据都塞到一个列中,那么使用数据库实际上没有任何好处。在对数据进行有意义的操作之前,您需要将数据分离为逻辑字段/列/任何您想要调用它们的内容。

好吧,我已经在SQL Server的NTEXT列中使用键/值对标签分离列表4年多了,现在它工作了。你确实失去了进行查询的灵活性,但另一方面,如果你有一个持久化/取消持久化键值对的库,那么这不是一个坏主意。

是的,有那么糟糕。我的观点是,如果你不喜欢使用关系数据库,那么寻找一个更适合你的替代方案,有很多有趣的“NOSQL”项目,它们具有一些非常高级的功能。

关于SO提问有很多问题:

如何从逗号分隔的列表中获得特定值的计数 如何从逗号分隔的列表中获得仅具有相同2/3/etc特定值的记录

逗号分隔列表的另一个问题是确保值是一致的——存储文本意味着可能会出现错别字……

这些都是非规范化数据的症状,并强调了为什么应该始终为规范化数据建模。非正规化可以是一种查询优化,在实际需要时应用。