【发布时间】:2016-03-12 17:03:55
【问题描述】:
我将在一个系统中实现几个查找表。通常,所有查找表都具有相同的结构,例如 id, name, value, rank, active
我们在这个项目中使用 AngularJS 作为前端和 Web API/Entity 框架作为后端
我有一些选择
选项 1 - 创建一组具有相同结构的查找表 例如LKRegion、LKStatus、LKPeriod、LKState、LKDepartment等 此选项是传统设计。数据模式是结构化的且易于理解。很容易实现/强制执行外键完整性。但是您必须创建单独的 Web 方法来处理 CRUD 操作。如果将来要添加另一个查找表,则必须重复相同的操作。
选项 2 - 通过添加一个名为 LookupType 的额外列来标识查找组来创建一个大查找表 此选项减少了表的数量。使查找表易于维护和检索(例如,一种模式、一种 Web 方法可以处理所有常规查找 CRUD 操作)。但是由于 LookupType,外键完整性有点松散。
请分享您的偏好并告诉我原因。我想获得有关此实施的最佳实践。谢谢!
【问题讨论】:
-
选项 2) 没有任何优势,从我的角度来看,丢失正确的外键是一个障碍。 “减少表的数量”没有意义。它不会使您的数据库更快或更小或更易于维护(实际上它会更难维护:如果您需要为一种查找类型添加新属性怎么办?然后为另一种查找类型添加另一个属性?)。选项 2 被称为 anti 模式“一个真正的查找表”
-
如果我的查找表只是用于提供下拉列表文本/值,我以后可能不需要额外的属性,所以我将忽略属性维护的缺点。我对选项 1 的担忧是,如果我需要实现一个新的查找表,我需要拖动新的数据模式并重新编译项目。对于选项 2,它只是一个数据更改。如果考虑将项目从开发推广到生产,并且在同一个项目中进行了许多开发,并且有些还没有准备好上线,那么选项 2 更合适,风险也更小。
-
@RayGao,在设计数据库时,数据完整性比 CRUD 操作的易用性更重要。通常,数据的寿命比为该数据提供用户界面的应用程序的寿命长得多。 10 年后将会有另一个新的闪亮框架,新的应届毕业生将在任何地方使用它们,但业务将继续使用积累的数据,重要的是数据保持有效和正确。这就是为什么在数据库级别而不是在应用程序级别强制执行诸如外键之类的约束很重要的原因。
-
如果您添加一个新的查找表,该表将被一些 other 表使用 - 这很可能也是新的。因此,无论如何您都需要推出新版本的应用程序(添加未使用的新查找表有什么意义)。您可能现在看不到扩展这些表的必要性,但您确定一年内没有一个吗?还是两年?重要数据的寿命比应用程序长很多。很多时候,应用程序被重新设计,但保留旧数据。稍后修复错误的数据模型比从一开始就以正确的方式修复要复杂得多。
-
关于“我可能不需要额外的属性”——即使你说“我永远不需要额外的属性”,无论如何这会在一年左右的时间内改变:)
标签: sql database asp.net-web-api