Sql 一个大的域表被认为是糟糕的设计吗?
我必须向正在维护的web应用程序添加一些功能,并且必须决定修改数据库(Sql Server 2010)的路径,以便存储和检索应用程序需要的新数据 “丑陋但快速”路径:Sql 一个大的域表被认为是糟糕的设计吗?,sql,Sql,我必须向正在维护的web应用程序添加一些功能,并且必须决定修改数据库(Sql Server 2010)的路径,以便存储和检索应用程序需要的新数据 “丑陋但快速”路径: web应用程序已经有了这个“通用域表”,它存储了可以通过存储过程检索和筛选的不同域数据,并指定了域字段。 比如: | Id | Description | Domain | |------------|-------------|--------------| | 001 | App
web应用程序已经有了这个“通用域表”,它存储了可以通过存储过程检索和筛选的不同域数据,并指定了域字段。
比如:
| Id | Description | Domain |
|------------|-------------|--------------|
| 001 | Apple | Fruit |
| 002 | Peach | Fruit |
| 003 | Banana | Fruit |
| A01 | Yellow | Color |
| A02 | Red | Color |
| A03 | Green | Color |
SP_GetDomainValues @Domain='Fruit'
该表已经有了应用程序层,可以轻松地存储和检索数据。我所需要的只是创建一个数据库脚本,用适当的新域填充表中的新记录。
我应该补充一点,这个应用程序还有几个域表,每个域表只存储一个域 “好但慢”路径:
我必须创建不同的表、存储过程和DAL方法来存储和检索数据 我个人喜欢这两种方法的第二种:
- 在查询中使用数据要容易得多,因为您可以自然地加入到 表,而不是一个大表的子集
- 数据可以很自然地使用外键约束进行验证, 如果您有一个表,可能命名为 “通用域”。并不是说这不完全可能,只是 使用约束很麻烦
根据您的经验,第一个选择是一个糟糕的设计,还是在某些情况下可以使用它而不会感到太内疚 我会继续做已经存在的事情:通过添加数据来完成工作对我来说听起来不错,即使它不是“完美的” 还要考虑到,您的“好”设计需要模式更改、新代码和测试,所有这些都是昂贵的,而且会带来风险。与往常一样,这取决于具体情况 如果应用程序正在运行,并且没有可能的功能增强,那么您可以做一些快速而肮脏的事情,继续您的生活。企业可能会感谢您,因为这是最快、最容易预测的路线。您会对将代码保持在不比您发现的更好的状态而感到不安,但您希望接下来能够从事更有益的工作 如果应用程序中存在bug,或者将来可能需要添加更多功能,或者如果您是此应用程序的长期维护所有者,则需要权衡使用此模型的未来痛苦与使其进入更可维护状态的短期痛苦 正如没有名字的@a_horse_所写的那样,您概述的设计是一种众所周知的反模式。它是脆弱的——数据的变化会以各种令人兴奋的方式破坏应用程序;它依赖于许多不同的层,所有这些层都理解底层的数据存储机制,并且能够记住“水果”的正确单词(包括大小写、拼写和任何不规则的空格)。它依赖于应用程序逻辑来检查数据的有效性-没有引用完整性-在大多数情况下,这会在某些地方失败,因此无辜的最终用户会输入一个他们认为正确的值,但这会以某种方式打破规则,永远丢失
这样,如果你必须在这段代码中存活一段时间,我会考虑重构它。我将首先为现有代码编写单元测试和集成测试,并尝试逐步重构应用程序的各个部分,以使用更合理的数据库模型。转换整个应用程序可能需要与原始版本一样多的时间,大多数商业人士都不会高兴地听到添加几个简单的额外功能需要整个重建-因此,寻找实用的方法来达到您想要的目的
这种反模式也被称为“一个真正的查找表”(search for it)。它绝对没有优点,也有许多缺点(例如,没有外键约束)