3

我有一张表格,其中包含有关可以由两类公民和工人中的人完成的不同类型事件的信息

所以对于他们每个人,我都有各自的桌子

civil{  civil_id, name, age,telephone...} the  primary key is civil_id

worker{ worker_id, name, duty, department...} the  primary key is worker_id

那么事件表有一个所有可能事件的列表

event {type_of_event} the  primary key is type_of_event

然后我打算将信息存储在其他表中

使用 eventype,完成工作的人(工人或公民)

id  event_type       date      person
-----------------------------------
1   type1         12-12-12     x 
2   type1         05-12-10     y
3   type2         02-12-12     y

现在在这个设计中,我不知道如何联系谁做这项工作,如果我只有一种人(又名民事),我只会在最后一张表中的 person 字段中存储 Civil_id....但是如何知道是公务员还是工人,我需要其他中间表吗?

4

2 回答 2

8

一般来说,有一些方法可以模拟这种情况......

使用独占外键

在此处输入图像描述

event,civil_idworker_id都可以为 NULL,但也有一个约束确保它们中的一个在任何给定时间都是非 NULL 的:

CHECK (
    (civil_id IS NOT NULL AND worker_id IS NULL)
    OR (civil_id IS NULL AND worker_id IS NOT NULL)
)

使用继承1

在此处输入图像描述

有关继承的更多信息,请查看ERwin 方法指南这篇文章中的“子类型关系”一章。


1阿卡。类别、子类型、子类化、泛化层次...

于 2013-02-28T12:15:25.017 回答
1

在这个罐子里,你不能设置一个foreign key,因为你有多个父母。为了进行快速搜索或避免在表full table scan上的列上定义索引并使用. 例如,personeventLEFT JOIN

SELECT  ....,
        COALESCE(b.name, c.name) AS personname
FROM    event a
        LEFT JOIN civil b
            ON a.person = b.civil_id
        LEFT JOIN worker c
            ON a.person = c.worker_ID

添加INDEX

ALTER TABLE event ADD INDEX (person)
于 2013-02-28T05:41:13.640 回答