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

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

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

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


当前回答

一般来说,只要能满足项目的要求,任何东西都是可以防御的。这并不意味着人们会同意或想要捍卫你的决定……

一般来说,以这种方式存储数据是次优的(例如,难以进行有效的查询),如果修改表单中的项,可能会导致维护问题。也许您可以找到一个中间立场,使用一个整数来表示一组位标志?

其他回答

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

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

一般来说,只要能满足项目的要求,任何东西都是可以防御的。这并不意味着人们会同意或想要捍卫你的决定……

一般来说,以这种方式存储数据是次优的(例如,难以进行有效的查询),如果修改表单中的项,可能会导致维护问题。也许您可以找到一个中间立场,使用一个整数来表示一组位标志?

如果你有一个固定数量的布尔字段,你可以使用INT(1) NOT NULL(或BIT NOT NULL,如果它存在)或CHAR(0)(可空)。您也可以使用SET(我忘记了确切的语法)。

“其中一个原因是懒惰。”

这敲响了警钟。你应该这样做的唯一原因是你知道如何以“正确的方式”做这件事,但你已经得出结论,有一个切实的理由不这样做。

话虽如此:如果您选择以这种方式存储的数据是您永远不需要查询的数据,那么可能有理由以您所选择的方式存储它。

(有些用户会对我上一段中的说法提出异议,说“你永远不知道将来会增加什么需求”。这些用户要么是被误导了,要么是在陈述宗教信仰。有时候按照摆在你面前的要求工作是有利的。)