【发布时间】:2018-01-29 15:38:27
【问题描述】:
我是使用数据库的新手,我正在尝试设计一个新的数据库,我认为我需要在许多表中建立一对一的关系。
为了演示我的设计,假设我正在构建一个时间表数据库作为示例。我首先为具有一对多关系的人创建一个表
CREATE TABLE person (
person_id SERIAL NOT NULL,
name VARCHAR,
PRIMARY KEY (person_id)
);
接下来,我创建一个事件表,其中包含人员关系的许多部分
CREATE TABLE events (
event_id SERIAL NOT NULL,
type VARCHAR,
name VARCHAR,
person_id INTEGER,
time TIMESTAMP WITHOUT TIME ZONE,
PRIMARY KEY (event_id),
FOREIGN KEY(person_id) REFERENCES person (person_id)
);
现在假设我有两种不同类型的事件,它们有不同的信息,比如吃饭和作业
CREATE TABLE meals (
event_id INTEGER NOT NULL,
food VARCHAR,
utensils VARCHAR,
PRIMARY KEY (event_id),
FOREIGN KEY(event_id) REFERENCES events (event_id)
);
CREATE TABLE homework (
event_id INTEGER NOT NULL,
subject VARCHAR,
completed BOOLEAN,
score FLOAT,
PRIMARY KEY (event_id),
FOREIGN KEY(event_id) REFERENCES events (event_id)
);
现在,我尝试以这种方式设计数据库的原因是,有时您可能只想显示每个人的基本事件列表,而不管该事件是什么。例如,如果我按如下方式初始化表
INSERT INTO person (name) VALUES ('Brad');
INSERT INTO events (type, name, person_id, time) VALUES ('meal', 'lunch', 1, '12/28/2016 12:00:00')
INSERT INTO events (type, name, person_id, time) VALUES ('meal', 'breakfast', 1, '12/28/2016 12:00:00');
INSERT INTO meals (event_id, food, utensils) VALUES (1, 'eggs', 'fork');
INSERT INTO meals (event_id, food, utensils) VALUES (2, 'turkey sandwich', 'hands');
INSERT INTO events (type, name, person_id, time) VALUES ('homework', 'final project', 1, '12/28/2016 18:00:00');
INSERT INTO homework (event_id, subject, completed, score) VALUES (3, 'Math', 'T', 0.93);
然后我可能想为 Brad 生成所有事件的列表
SELECT (events.time, events.type, events.name) FROM events
LEFT JOIN person ON person.person_id = events.person_id
WHERE person.name = 'Brad';
这很简单,我很困惑的是,如果我想看看 Brad 吃了什么怎么办。我想我可能可以在person 和events 和events 和meals 之间使用两个JOIN 语句,但是如果我只想浏览Brads 事件并获取有关每个事件的所有额外信息怎么办? (例如,如果活动是一顿饭,告诉我他吃了什么,如果是家庭作业,告诉我他得到的分数)?
总的来说,我有几个问题。
- 这是一个好的数据库设计还是我应该考虑的其他问题?上面的每个潜在用例,再加上几个,都是我需要使用数据库的标准。
- 如何轻松确定在哪个表中查找事件表中任何给定事件的更多信息?这里有几个想法——我可以将包含有关事件的更多信息的另一个表的名称存储在事件表中(即,将
type列替换为table列)但我想我在某处读到是个坏主意。
还有一些注意事项,我正在使用 Postgresql 作为数据库。除了我在这里展示的内容之外,我正在构建的实际数据库中的每个表都有更多详细信息。我只是想说明我想要达到的目的。最后,我正在使用 sqlalchemy 的 ORM 构建/访问数据库,所以如果有一个漂亮的技巧我可以使用 relationships 来做这将有助于了解这一点。
【问题讨论】:
-
好问题,解释清楚。据我了解,我认为您的数据库设计没有那么糟糕,不过我想看看其他人的想法。
标签: sql database postgresql sqlalchemy