消除提议的 ER 图中关系之间的循环
Elimination of cycle between relationships in the proposed ER diagram
在为一个简单的数据库制作ER模式时,我遇到了以下问题:
- 我在图中得到了一个循环,我不知道它是否多余,或者我可以通过某种方式将其删除。
我大范围地提出问题:
- 访问实体记录乘车访问伦敦的次数。该实体包含有关他们到达、离开和总访问时间的信息。
- 车辆实体包含有关车辆原产地、二氧化碳排放量及其车牌的信息。
- 实体日期包含其对应的星期几的每个日期的信息以及添加的任何地区的假期名称。
实体 Date
的区域与 Vehicle
区域匹配。实体 Visit
的 entry_date/end_date 与实体 Date
的日期匹配。最后将实体Vehicle
的车牌匹配到实体Visit
的车牌。这样就出现了我一开始说的循环
ER图如下:
如果对我没有解释的问题有任何疑问,请随时问我。我欢迎提出改进 ER 图的建议,如果您认为它是正确的,可以删除循环或简单地保持原样。
Vehicle 和 Date 实体之间的 Relate 关系在这里是多余的。您仍然可以从现有关系中找到每次访问车辆的日期。如果把ER图转成DB表就更清楚了
为什么entry_date和exit_date两个属性是Visit实体? many-to-2 与 Date 实体的关系已经考虑了这些。从 Visit 中删除这两个属性以及 number_plate。最后,向 Visit 实体添加一个唯一 ID。
我的两毛钱-
“Date”确实不是实体或 table 的好名称。
首先,它太笼统了,无法传达你真正指的是什么。
其次,它是大多数常用语言的保留关键字。只会给编程带来不必要的麻烦
您使用“日期”来获取假期名称(针对特定地区)和工作日,对吗?
我的建议是你只需要在这个 table 中保存假期,因为工作日可以用大多数常见的编程语言计算出来。
这个“日期”table只是一个查找table来帮助你找出假期,你不需要强制“日期”和访问
之间的关系
我还建议您添加区域 table 以强制执行一致的命名。
这是数据库图,我将“date”重命名为“holiday”
这是 SQL 服务器实现 -
create table region (
region_code varchar(100) primary key
,region_name varchar(100)
)
create table holiday (
holiday_date date not null
,region_code varchar(100) not null
,holiday_name varchar(100) not null
)
alter table holiday add primary key (holiday_date, region_code)
alter table holiday add foreign key (region_code) references region (region_code)
create table vehicle (
number_plate varchar(100) primary key
,region_code varchar(100) not null
,CO2_emission varchar(100)
)
alter table vehicle add foreign key (region_code) references region (region_code)
create table visit (
number_plate varchar(100) not null
,entry_date date not null
,end_date date
)
alter table visit add primary key (number_plate, entry_date)
alter table visit add foreign key (number_plate) references vehicle (number_plate)
在为一个简单的数据库制作ER模式时,我遇到了以下问题:
- 我在图中得到了一个循环,我不知道它是否多余,或者我可以通过某种方式将其删除。
我大范围地提出问题:
- 访问实体记录乘车访问伦敦的次数。该实体包含有关他们到达、离开和总访问时间的信息。
- 车辆实体包含有关车辆原产地、二氧化碳排放量及其车牌的信息。
- 实体日期包含其对应的星期几的每个日期的信息以及添加的任何地区的假期名称。
实体 Date
的区域与 Vehicle
区域匹配。实体 Visit
的 entry_date/end_date 与实体 Date
的日期匹配。最后将实体Vehicle
的车牌匹配到实体Visit
的车牌。这样就出现了我一开始说的循环
ER图如下:
如果对我没有解释的问题有任何疑问,请随时问我。我欢迎提出改进 ER 图的建议,如果您认为它是正确的,可以删除循环或简单地保持原样。
Vehicle 和 Date 实体之间的 Relate 关系在这里是多余的。您仍然可以从现有关系中找到每次访问车辆的日期。如果把ER图转成DB表就更清楚了
为什么entry_date和exit_date两个属性是Visit实体? many-to-2 与 Date 实体的关系已经考虑了这些。从 Visit 中删除这两个属性以及 number_plate。最后,向 Visit 实体添加一个唯一 ID。
我的两毛钱-
“Date”确实不是实体或 table 的好名称。 首先,它太笼统了,无法传达你真正指的是什么。 其次,它是大多数常用语言的保留关键字。只会给编程带来不必要的麻烦
您使用“日期”来获取假期名称(针对特定地区)和工作日,对吗? 我的建议是你只需要在这个 table 中保存假期,因为工作日可以用大多数常见的编程语言计算出来。
这个“日期”table只是一个查找table来帮助你找出假期,你不需要强制“日期”和访问
之间的关系我还建议您添加区域 table 以强制执行一致的命名。
这是数据库图,我将“date”重命名为“holiday”
这是 SQL 服务器实现 -
create table region (
region_code varchar(100) primary key
,region_name varchar(100)
)
create table holiday (
holiday_date date not null
,region_code varchar(100) not null
,holiday_name varchar(100) not null
)
alter table holiday add primary key (holiday_date, region_code)
alter table holiday add foreign key (region_code) references region (region_code)
create table vehicle (
number_plate varchar(100) primary key
,region_code varchar(100) not null
,CO2_emission varchar(100)
)
alter table vehicle add foreign key (region_code) references region (region_code)
create table visit (
number_plate varchar(100) not null
,entry_date date not null
,end_date date
)
alter table visit add primary key (number_plate, entry_date)
alter table visit add foreign key (number_plate) references vehicle (number_plate)