我经营一家小型食品生产企业,我需要管理客户订单。我已经构建了我业务这方面的概念数据模型,但我需要一些关于如何在RDMS中完全实现它的指针。
作为第一步,我提出了下面给出的逻辑模型。我对数据建模的了解有限,因此我的图表中可能存在错误,但希望它能传达我的意图。请注意,这只是较大模式的简化部分,为简单起见,我只提供相关表格。
我在MySQL中实现了上述模式,我编写了一些小程序来用客户订单填充表格。这可以完成工作,但没有太多考虑数据完整性。我注意到,通过此实现,一些数据完整性规则不会在数据库级别强制执行。
例如,FoodItem是OrdrItem的子类型。对于FoodItem中的每一行,OrdrItem中必须只有一个对应的行。但是,在其当前实现中,我可以从FoodItem中删除一行,从而在OrdrItem中留下一行而在其中一个子类型表中没有相应的行。这是不允许的。
我希望将这些数据完整性规则融入到数据库中,这样我就不必担心自己在每个新客户端应用程序中执行它们,抛弃脚本或我写的伪劣SQL语句。我怀疑,如果我不在数据库级别做出这些保证,那么我将极大地增加遇到数据完整性问题的机会。
我对存储过程,触发器和用户定义函数的了解最少。我得到的印象是,部分或全部这些功能可以帮助我实现我想要的目标。但是,如果我能够通过检查约束,外键和相对简单的功能完成工作,我很乐意走这条路。基本上,我想尽可能地限制复杂性,如果没有保证,不要引入每个漂亮的数据库功能。是否有可能确保我想要的数据完整性,而无需借助存储过程,触发器,用户定义的函数和其他更深奥的数据库功能?
我愿意使用MySQL或Postgresql来实现我的解决方案,因为我对这两个系统都有基本的工作知识。
最后,如果这种对数据完整性的方法被认为是过度的,或者如果有一个更实用但稍微不完美的解决方案,我也会对此持开放态度。
答案 0 :(得分:1)
不幸的是,"现代" DBMS不直接支持您可以放入ER图中的所有花哨符号 1 。物理FOREIGN KEY实际强制执行的所有内容都是没有父节点就不能存在子行,这样就可以得到一个简单的" 1到0或N" 关系 2
你可以......
...但是那就是你可以做的所有事情"开箱即用"。
要强制执行其他规则 3 ,您必须要么显着地" uglify"该模型可能采用延迟约束 4 ,或者您可以在程序代码 5 中执行此操作。
虽然你在数据库本身尽可能多地使用完整性规则的直觉是点亮,但它仍然被认为是一个较小的邪恶,只是强制执行"不寻常"过程代码中的情况,而不是将数据模型扭曲到椒盐卷饼中以适应声明性约束的限制。
事实上,最流行的技术之一是创建一个" API":
这是一个相当重的"但是,如果方案足够简单,可能不值得麻烦。如果您的应用程序是唯一一个要修改数据库的应用程序,那么只需在客户端代码中实现规则就足够了......
1 例如继承(又名。子类型,类别,泛化层次结构)。
2 左侧:任何给定的孩子必须有" 1"家长。右侧:任何给定的父母必须有" 0或N"孩子。
3 正如您已经指出的那样,对于继承很重要的孩子的exclusivity and presence。
4 PostgreSQL支持但不支持MySQL。
5 按优先顺序排列:
6 但要注意竞争条件:transaction isolation会保护你免受其中一些人的伤害,但不是全部,而你可能需要做一些明确的锁定。< / em>的