COMP9311 Database Systems WEEK3

1. ER-to-relational Mapping Review

ER的entity对应relational的table;ER entity的attribute对应table的attribute;ER的relationship map到relational的时候尽量减少数据null的可能,同时少创建新的table。(n:m的relationship必须要创建新的table;1:n的relationship要把1的primary key和relationship的attribute都作为foreign key添加进n的table;1:1的优先侧重total participation)
注意:ER map to relational的时候不能把所有关系map过去,比如一些total和partial participation是没有办法兼顾的。

2. from 2-way to n-way relationships

binary relationship根据1:1, 1:n, n:m很容易从ER map,之后是大于2个entity的relationship如何map。通常有两种方式,一种是把relationship当成一个entity将>2的relationship转化成binary,另一种是不当成entity。
(1)不将>2的relationship处理成entity

3-way_relationship

presribe连接了3个entity,doctor, patient, drug。仿写many to many的binary处理方法,新建一个table放置prescribe关系,将doctor, patient, drug的primary key放入新table作为foreign key,同时存储quantity和date这样的relationship attribute。剩下一个问题是新table的primary key如何设置?一种方法是直接用相连的entity的primary key形成一个key组,但这样的坏处是与relationship实际情况有差别,在这种情况下意味着database中一个病人从一个医生开一种药一生只能有一次。所以推荐另一种方式,根据实际情况来设置。在当前情境下,prescribe一定要有药的dno,由病人取药,事情一定发生在具体的一个date。这样,primary key一定要有date, pid, dno,意味着不同date同一个病人找同一个医生可以开同一种药,doctor没有放入primary key是因为可以通过这组primary key检索到prescribe的doctor。这里不能再省略drug,不然primary key只有date和pid,意味着一个病人在一天内找一个医生只能开一种药。

create domain NameValue as varchar(100) not null;
create table Doctor(
    tfn integer,
    name NameValue,
    specialty text not null,
    primary key (tfn)
);
create table Drug(
    dno integer,
    name NameValue unique,
    formula text,
    primary key (dno)
);
create table Patient(
    pid integer,
    name NameValue,
    address text not null,
    primary key (pid)
);
create table Prescribes(
    doctor integer not null references Doctor(tfn),
    drug integer references Drug(dno),
    patient integer references Patient(pid),
    quantity integer not null,
    "date" date,
    primary key ("date", drug, patient)
);

(2)把relationship当成一个entity将>2的relationship转化成binary

3-way_relationship_alternative

把prescribe的relationship变成了entity,出现3个binary relationship,其中2个是1 to many,不需要新table,另一个many to many,需要一个新的table。

create domain NameValue as varchar(100) not null;
create table Doctor(
    tfn integer,
    name NameValue,
    specialty text not null,
    primary key (tfn)
);
create table Drug(
    dno integer,
    name NameValue unique,
    formula text,
    primary key (dno)
);
create table Patient(
    pid integer,
    name NameValue,
    address text not null,
    primary key (pid)
);
create table Prescription(
    prNum integer,
    "date" date not null,
    doctor integer not null references Doctor(tfn),
    patient integer not null references Patient(pid),
    primary key (prNum)
);
create table PrescriptionItem(
    prescription integer references Prescription(prNum),
    drug integer references Drug(dno),
    quantity integer check (quantity > 0),
    primary key (prescription, drug)
);

3. Mapping composite attributes

Mapping composite attributes

上例中,address和name都是composite attributes,如何map取决于实际使用需要。如果需要读取address和name,则第一种写法比较合适,把所有的下层attribute打个包写在address和name中。但是如果需要搜索在某个postcode中的所有人,那么下层的attribute需要被使用,这个时候第二个写法比较合适,把所有下层的attribute分开写入table。

4. Mapping multi-valued attributes

Mapping multi-valued attributes

上例中,favourite colours是multi-valued,必须新建一个table,不然一个确定的人在这个数据库中就只能有一个喜欢的颜色。新建的table中不仅要有colour,还要有SSN,而且二者都要是primary key。如果只有SSN是primary key,那么在FavColour table中会出现相同的SSN对应不同的colour,而SSN在person中是primary key,必须是unique的,产生冲突,故SSN和colour都必须是primary key。

5. Derived attributes

Mapping derived attributes

上例中,age可以由birthDate计算得出,所以不要写入person的table中

create table Person(
    ssn char(20),
    familyName varchar(50),
    givenName varChar(50) not null,
    weight float,
    birthDate date,
    primary key (ssn)
);
create table PersonHobbies(
    person char(20) references Person(ssn),
    hobby varchar(50),
    primary key (person, hobby)
);

6. Mapping subclasses

通常有三种方法,一种是用ER style,subclass的table中包含subclass的attribute和superclass的primary key;一种是object-oriented style,subclass中包括subclass的attribute和所有superclass的attribute;一种是single table with nulls,扁平化,只有一个table。
(1)ER style

Subclass ER style mapping

Employee和Manager的table都包含Person的primary key,SSN在Employee和Manager中都作为primary key,但同时也是foreign key连接到Person。
(2)OO style

Subclass OO style mapping

Employee和Manager的table都包含Person的SSN,但SSN不做搜索用,因为所有信息都已经在Employee和Manager的table中。
(3)Single table with Nulls

Subclass single table with Nulls

一个table的坏处是会出现很多有null的instance,这里如果只有bonus是NULL,则这个人是employee;如果salary, position, bonus都是NULL,则这个人是person。

7. Mapping disjoint subclass

Mapping disjoint subclasses

(1)ER style
这个例子中student的subclass是total participation,在ER style中无法体现。

create table Student (
    sid integer primary key,
    name text,
    address text
);

create table Ugrad (
    sid integer references Student(sid),
    degree text,
    primary key (sid)
);

create table Masters (
    sid integer references Student(sid),
    major text,
    primary key (sid)
);

create table Research (
    sid integer references Student(sid),
    thesis text,
    primary key (sid)
);

(2)OO style
这个例子中student的subclass是total participation,在OO style中无法体现。

create table Student (
    sid integer primary key,
    name text,
    address text
);

create table Ugrad (
    sid integer references Student(sid),
    name text,
    address text,
    degree text,
    primary key (sid)
);

create table Masters (
    sid integer references Student(sid),
    name text,
    address text,
    major text,
    primary key (sid)
);

create table Research (
    sid integer references Student(sid),
    name text,
    address text,
    thesis text,
    primary key (sid)
);

(3)Single table with Nulls
这个例子中student的subclass是total participation,在single table中可以表示出来。

create table Student (
    sid integer primary key,
    name text,
    address text,
    degree text,
    major text,
    thesis text,
    constraint DisjointTotal check
    ((degree is not null and major is null and thesis is null)
     or
     (degree is null and major is not null and thesis is null)
     or
     (degree is null and major is null and thesis is not null))
);

如果是partial participation

create table Student (
    sid integer primary key,
    name text,
    address text,
    degree text,
    major text,
    thesis text,
    constraint DisjointPartial check
    ((degree is not null and major is null and thesis is null)
     or
     (degree is null and major is not null and thesis is null)
     or
     (degree is null and major is null and thesis is not null)
     or
     (degree is null and major is null and thesis is null))
);

8. Mapping overlapping subclass

Mapping overlapping subclasses

ER style和OO style没有办法直接表示出overlapping和disjoint的区别,需要加trigger,比如

stype text not null
        check (stype in ('ugrad', 'masters', 'research')),

single table with Nulls, total participation

create table Student (
    sid integer primary key,
    name text,
    address text,
    degree text,
    major text,
    thesis text,
    constraint OverlappingTotal check
    (degree is not null or major is not null or thesis is not null)
);

single table with Nulls, partial participation

create table Student (
    sid integer primary key,
    name text,
    address text,
    degree text,
    major text,
    thesis text
    -- no constraint needed
);

9. Relational DBMSs

Relational DBMSs近似于Relational model,帮助定义domains, attributes, tuples, tables, constraints(domain, key, referential)。区别是它不严格限定table必须要有keys,使用bag semantics而不是set semantics。

bag semantics可以理解为multiset,在集合中允许重复元素,比如{a, a, b}

RDBMS的operation要符合ACID:ACID (atomicity, consistency, isolation, durability) is a set of properties that guarantee database transactions are processed reliably.

10. Using PostgreSQL in CSE

注意使用后要停止server并且登出CSE的主机。

wagner$ ssh YOU@grieg
grieg$ priv srvr
grieg$ source /srvr/YOU/env
grieg$ pg start
grieg$ psql mydb
... do stuff with your database ...
grieg$ pg stop
grieg$ exit

11. Building/Maintaining Databases

Shell commands

createdb dbname
dropdb dbname
psql dynamo -f dumpfile
--restore/dump file

SQL statements

CREATE DATABASE dbname 
DROP DATABASE dbname

CREATE TABLE table ( Attributes+Constraints ) 
ALTER TABLE table TableSchemaChanges 
COPY table ( AttributeNames ) FROM STDIN
DROP TABLE table(s)
TRUNCATE TABLE table(s)
--Remove the content of the table, but the table stays

INSERT INTO table ( attrs ) VALUES tuple(s)
DELETE FROM table WHERE condition
UPDATE table SET AttrValueChanges WHERE condition
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容