解释我的问题,我举一个简单的例子:
我的数据库有三个表:
[positions] - position_id INT - position VARCHAR [employees] - employee_id INT - position_id INT - FK - name VARCHAR - birth_date DATE [vehicles] - vehicle_id INT - model VARCHAR - year VARCHAR - color VARCHAR
问题在于我必须将一辆车与一名员工联系在一起,该员工在公司中的位置是“司机”,并且只在这种情况下。
我尝试使用继承并创建另一个名为“Driver”的表,其中一个ForeignKey与一个员工关联(1-1关系),但我无法使其工作,因为在编程阶段我将不得不手动验证如果所选位置id(在HTML select元素中)是“Driver”的id。我认为这不是一个好的编程实践。
总之,我想知道在不影响关系数据库或编程的情况下是否还有其他方法可以做到这一点。
提前致谢! 抱歉英语不好,这不是我的主要语言。 我希望你能理解。
答案 0 :(得分:5)
这是一项商业规则 - “只有位置=驾驶员的员工才能与车辆相关联”。业务规则通常在编程中实现,这不是一个坏习惯。编程用于编写业务逻辑。通常,在开发任何应用程序时,您将获得大量此类实例,这些实例无法在数据库级别实现。
但是,如果您仍希望在数据库级别对此进行控制,则可以使用触发器并在插入/更新级别检查此验证。
答案 1 :(得分:2)
不幸的是,关系数据库只是没有做出好的分层对象存储。您可能会考虑使用某种对象关系模型来伪造它,但是你是对的:这不是好习惯。也许考虑purpose-built object datastore而不是传统的RDBMS。
答案 2 :(得分:1)
通过各种权衡,有很多方法可以做到这一点。 Scott Ambler有一个great page列出了图表的备选方案。
答案 3 :(得分:0)
执行此操作的最佳方式可能是将员工EmployeeVehicles
连接到车辆。是的,这意味着您的应用程序(或者可能是触发器或存储过程)必须确保只有特定类型的Employee
实际上会在EmployeeVehicles
中有记录,但这些通常是最好的存储您的业务逻辑。数据库用于以尽可能最规范化的方式存储数据,而不是跟踪特定于业务的规则。据他们所知,一些员工(0 .. *)可能有车(1 .. *,或者1..1)。