注意:
菱形:关系集
矩形:实体集,上方是表名称,下方是属性,主码加下划线
特别的:如果一个实体集没有主码,它的某些属性和另一个元素的主码一起可以作为分辨,则那些属性叫做部分码,加下划线,这个实体集叫做弱实体集
箭头:箭头指向的对象是一个,箭头出发的对象可以有多个和其对应
双菱形:弱实体集和强实体集的关系集
双线:用于实体集和关系集的连接,表示参与度是全部参与,这个实体集全部被用到了。一般多对一的,那些多的实体集必须用双线和关系集连接。然后关系集指向一的实体集。
ER图绘制方法:
1.列出题目中提到的实体,看需要记录哪些属性
2.检查实体还是属性:
实体是否是别的实体的一个属性,是则转为属性
如果属性是多值的,那么分裂出去作为一个新的实体,创建一个关系集
3.检查冗余:如果一个属性是别的实体的主码,则删除,创建一个关系集。
根据ER关系绘制ER图。
举例:Please design an ER diagram for a takeaway platform(外卖平台)to capture information about restaurants, customers, couriers(快递员), orders , payments, and deliveries, etc. A restaurant sell items on the platform. A customer has several addresses. A courier delivers packages of order to customers.
首先确定如下实体:
restaurants(res_id, items)
customers(cus_id, address, o_id, p_id, d_id)
courier(cou_id, o_id)
order(o_id, custom, payment, deliveries, item)
deliveries(d_id, o_id, p_id)
payment(p_id, o_id, d_id)
这些都是题目中提到的
检查属性还是实体:
一个饭店可以有多个item,因此分裂为实体,新建r_i关系集,同样,order的item也被分裂出去,新建order_item
一个顾客有多个address,因此分裂为实体,新建cus_addr关系集
deliveries, payment这些都是order的属性,因为一个order只有一个运送任务和一个付款。删除它们,把d_id和p_id加入到order中。不知道deliveries到达什么东西,所以不管了。
检查冗余:
顾客的o_id是主码,删除,新建cus_o
快递员o_id, cus_id是主码,删除,新建cou_o, cou_cus
订单的cus_id是主码,删除,新建o_cus
结果:
item
address
restaurants(res_id, i_id)
customers(cus_id)
courier(cou_id)
order(o_id, pay)
res_item
o_cou
o_cus
o_item
cou_cus
addr_cus
6个实体,6个关系
答案为:
我觉得一个order应该只有一个pay,但是答案认为一个订单可以有多个付款,所以多了一个关系。另外答案认为订单记录了地址,我觉得订单记录了顾客,这些应该问题不大。
将ER图转为关系模式:
1.冗余:弱实体集和强实体集的联系集是冗余的
2.合并:有实体集A,B,和联系集AB,如果A或者B全部参与,那么可以合并为一个包含AB所有属性的实体集A’