【发布时间】:2014-06-12 08:50:59
【问题描述】:
我经营一家小型食品生产企业,我需要管理客户订单。我已经为我的业务的这方面建立了一个概念数据模型,但我需要一些关于如何在 RDMS 中完全实现它的指针。
作为第一步,我想出了下面给出的逻辑模型。我的数据建模知识有限,所以我的图表中可能存在错误,但希望它传达了我的意图。请注意,这只是较大架构的简化部分,为简单起见,我仅提供相关表。
数据模型简介
- 一个客户 Ordr 可以有一个或多个 OrdrItems
- OrdrItem 可以是 FoodItem 或 ComboItem
- ComboItem 是两个或多个 FoodItem 的逻辑分组
我已经在 MySQL 中实现了上述模式,并编写了一些小程序来用客户订单填充表。这可以完成工作,但没有太多考虑数据完整性。我注意到,通过这种实现,一些数据完整性规则并未在数据库级别强制执行。
例如,FoodItem 是 OrdrItem 的子类型。对于 FoodItem 中的每一行,OrdrItem 中必须恰好有一个对应的行。但是,在其当前实现中,我可以从 FoodItem 中删除一行,从而在 OrdrItem 中留下一行,而在其中一个子类型表中没有相应的行。这应该是不允许的。
一些进一步的数据限制
- 订单必须至少有一个关联的“订单项”(即订单不能为空)
- 订单项必须是 FoodItem 或 ComboItem 的一个关联子类型(即 OrderItem 不能同时是 FoodItem 和 ComboItem)。
- 未来可能会出现一些进一步的限制
我希望将这些数据完整性规则纳入数据库,这样我就不必担心它们在我编写的每个新客户端应用程序、一次性脚本或伪劣 SQL 语句中的执行情况。我怀疑如果我不在数据库级别做出这些保证,我会大大增加我以后遇到数据完整性问题的机会。
问题
我对存储过程、触发器和用户定义的函数只有最基本的了解。我的印象是这些功能中的一些或全部可以帮助我实现我想要的。但是,如果我可以单独使用检查约束、外键和相对简单的功能来完成工作,我会很乐意走这条路。基本上,我想尽可能地限制复杂性,如果没有必要,不要引入每一个漂亮的数据库功能。是否可以在不借助存储过程、触发器、用户定义函数和其他更深奥的数据库功能的情况下确保我想要的数据完整性?
我愿意使用 MySQL 或 Postgresql 来实施我的解决方案,因为我对这两个系统都有基本的工作知识。
最后,如果这种处理数据完整性的方法被认为是矫枉过正,或者如果有更实用但稍微不完善的解决方案,我也愿意接受。
【问题讨论】:
-
绝对不是标准的订单数据模型。标准订单数据模型将具有一种类型的 order_item,它将引用不同的产品类型,例如食物或组合。
-
+1 写得很好的问题。简短的回答通常是肯定的,但可能不是您当前的模式——那些 (ordrID, OrdrItemID) 元组不是一个好主意,并且字段名 fkey 是彻头彻尾的可怕。我希望你能找到一个志愿者来扩展这个(和那个,可能作为单独的问题)。如果不是(即使如此),我认为您应该寻求一些专业支持,至少可以帮助您正确地建模您的架构。
-
@Denis,感谢您在我的架构中发现问题。经过仔细检查,我发布的原始架构图有许多错误,主要涉及各种表中不应该存在的列。我已经把东西清理干净了,希望它看起来更理智一些。
标签: mysql sql database postgresql database-design