我们正在开发一个小项目,需要定制表的定价向导。 (是的,实际的自定义表 - 你吃的那种。从这里我称之为厨房餐桌,所以我们不要混淆)我想出了一个模型,其中每个厨房餐桌部分是一个数据库表。所以数据库看起来像这样:
TableLineItem
-------------
ID
TableSizeID
TableEdgeWoodID
TableBaseID
Quantity
TableEdgeWoodID
---------------
ID
Name
MaterialUnitCost
LaborSetupHours
LaborWorkHours
每个部分都必须能够计算其价格。大多数计算非常相似。我喜欢这个结构,因为我可以将它直接拖到linq-to-sql设计器中,并生成所有类。 (更少的代码编写意味着维护更少...)然后我实现了一个计算成本接口,它只接受表的大小。我写了一些测试,这个功能非常好。我添加了一个表,根据以前的选择过滤UI中的部分。 (你不能拥有特定饰面的特定木材。)在模型中有一些其他的例外,我对它们进行了硬编码。这个模型非常严格,不断变化的要求会改变数据模型。 (例如,如果所有桌子突然需要遮阳伞。)
在与同事们进行了多次会议之后(可能花了比考虑这个项目大小更多的时间),我的同事们决定他们更喜欢更通用的方法。像这样:
Spec
----
SpecID
SpecTypeID
TableType_LookupID
Name
MaterialUnitCost
LaborSetupHours
LaborWorkHours
SpecType
--------
SpecTypeID
ParentSpecType_SpecTypeID
IsCustomerOption
IsRequiredCustomerOption
等...
这是一种更通用的方法,可用于构建任何产品。 (比如,如果他们开始销售椅子......)我认为这需要更长的时间来实施,但将来会更灵活。 (虽然我怀疑我们会重新考虑这个。)你也失去了一些参照完整性 - 你需要触发器来强制不能为表木头设置表格。
提前致谢。如果您有任何问题,请告诉我,以便我可以更新。
答案 0 :(得分:3)
通过设计满足我的客户原始规格的数据库结构,但结果过于严格,我经常会遇到比我应该更多的事情,我总是会采用更灵活的方法,即使它需要更多时间建立。
答案 1 :(得分:3)
我现在没有时间给出完整的答案,但我会把它扔掉:
鉴于您在下面关于表格基础和树林的评论,您可以设置一个名为TableAttributes(或类似的东西)的表,每个可能的选项都是特定的表属性类型。然后,您可以强制执行任何给定选项仅用于通过外键应用的属性。
答案 2 :(得分:1)
数据库架构设计存在过度抽象的趋势,因为变更成本可能很高。我自己,我喜欢具有相当描述性的表名。我经常将架构设计与OO设计等同起来。例如,您通常不会创建名为Thing的类,您可能将其称为产品,家具,物品,与您的业务相关的东西。
在您提供的架构中,有一个抽象(规范)和特定(TableType_LookupID)的混合。我倾向于均衡抽象级别,因此使用像:
这样的实体ProductGroup (for the case where you have a product that is a collection of other products)
Product
ProductType
ProductDetail
ProductDetailType
etc.
答案 3 :(得分:1)
以下是我的经验告诉我的事情:
答案 4 :(得分:1)
选项B ..
通用通常比具体更好。软件已经注定要失败或通过它的设计仅针对某一组任务来达到它的容量。如果你构建了一些通用的东西,那么如果用抽象的方法对其可能的位置进行实际分析,它就会减少。只要你远离过度抽象和抽象不足,它可能就是最佳点。
在这种情况下,可能会得出“更少代码更多”的格言,因为您不必再回来重新编写它。