Database 关系数据库建模的正确方法

Database 关系数据库建模的正确方法,database,inheritance,relational,Database,Inheritance,Relational,为了解释我的问题,我将举一个简单的例子: 我的数据库有三个表: [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 VARC

为了解释我的问题,我将举一个简单的例子:

我的数据库有三个表:

[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 [职位] -位置id INT -位置VARCHAR [雇员] -雇员身份证 -位置_id INT-FK -名称VARCHAR -出生日期 [车辆] -车辆识别号INT -VARCHAR模型 -瓦查尔一年 -颜色变量 问题是,我必须将一辆汽车与一名在公司担任“司机”职务的员工联系起来,而且只有在这种情况下

我尝试使用继承并创建另一个名为“Driver”的表,其中有一个ForeignKey与一名员工(1-1关系)关联,但我无法使其工作,因为在编程阶段,我必须手动验证所选的position id(在HTML select元素中)是否是“Driver”的id。我认为这不是一个好的编程实践

总之,我想知道在不影响关系数据库或编程的情况下,是否还有其他方法可以做到这一点

提前谢谢! 对不起,英语不好,它不是我的主要语言。
我希望您能理解。

不幸的是,关系数据库不能很好地实现分层对象存储。你可以考虑使用某种对象关系模型来伪造它,但你是对的:这不是很好的练习。也许考虑一个代替传统的RDBMS。

不幸的是,关系数据库只是没有很好的层次对象存储。你可以考虑使用某种对象关系模型来伪造它,但你是对的:这不是很好的练习。也许考虑一个替代传统的RDBMS。

< P>这是一个业务规则,“只有位置=驱动器的雇员可以与车辆相关联”。业务规则通常在编程中实现,这是一种不错的做法。编程用于编写业务逻辑。一般来说,在开发任何应用程序时,都会得到大量无法在数据库级别实现的实例


但是,如果您仍希望在DB级别控制此验证,则可以使用触发器并在插入/更新级别检查此验证。

这是一条业务规则,“只有职位=驾驶的员工才能与车辆关联”。业务规则通常在编程中实现,这是一种不错的做法。编程用于编写业务逻辑。一般来说,在开发任何应用程序时,都会得到大量无法在数据库级别实现的实例


但是,如果您仍希望在DB级别控制此验证,则可以使用触发器并在插入/更新级别检查此验证。

最好的方法可能是使用一个表
EmployeeVehicles
,将员工连接到车辆。是的,这意味着您的应用程序(或者触发器或存储过程)必须确保只有特定类型的
员工
才会在
员工车辆
中有记录,但这些通常是存储业务逻辑的最佳位置。数据库的作用是以尽可能规范化的方式存储数据,而不是跟踪特定于业务的规则。据了解,一些员工(0..*)可能有车辆(1..*,或者1..1)。

实现这一点的最佳方法可能是有一个将员工与车辆连接起来的表
EmployeeVehicles
。是的,这意味着您的应用程序(或者触发器或存储过程)必须确保只有特定类型的
员工
才会在
员工车辆
中有记录,但这些通常是存储业务逻辑的最佳位置。数据库的作用是以尽可能规范化的方式存储数据,而不是跟踪特定于业务的规则。据it部门所知,一些员工(0..*)可能有车辆(1..*),或者可能有1..1.。

通过各种折衷方法可以实现这一点。Scott Ambler用图表列出了备选方案。

通过各种折衷方法可以实现这一点。Scott Ambler用图表列出了备选方案。

谢谢Andy,该页面真的帮了我大忙!正是我想要的。在我的例子中,我最终使用了一个通用的表结构,它还允许用户向不同类型的公司职位添加额外的字段。谢谢大家的回答。谢谢安迪,那一页真的帮助了我!正是我想要的。在我的例子中,我最终使用了一个通用的表结构,它还允许用户向不同类型的公司职位添加额外的字段。谢谢大家的回答。