使用列表行为设计SQL表
我有一张桌子使用列表行为设计SQL表,sql,database,postgresql,Sql,Database,Postgresql,我有一张桌子 Client ( id SERIAL PRIMARY KEY ); 另一张桌子 Exercise ( id SERIAL PRIMARY KEY ); 最后一张桌子 Workout ( name VARCHAR, creator INT REFERENCES Client(id), exercise INT REFERENCES Exercise(id), PRIMARY KEY(name,creator,exercise) ); 我的表还有其他一些列
Client (
id SERIAL PRIMARY KEY );
另一张桌子
Exercise (
id SERIAL PRIMARY KEY );
最后一张桌子
Workout (
name VARCHAR,
creator INT REFERENCES Client(id),
exercise INT REFERENCES Exercise(id),
PRIMARY KEY(name,creator,exercise) );
我的表还有其他一些列,但这些都是相关的。
一项训练有一个创建者,它有一个名称(例如“legs-monday”或其他名称),然后它有一个在此训练期间要执行的独特训练列表。所以在面向对象的方法中,这看起来像
Object Workout
string name
int creator
List<Exercise> exercises
我无法引用(名称、创建者),因为它没有标记为唯一,即使它是唯一的,我也只能添加一个练习。引用训练中的所有行似乎很愚蠢(我的关系数据库老师会活剥我的皮)
仅仅将一个任意条目引用到训练(名称、创建者、练习)是否是一种不好的做法?如果我有名字和创建者,我可以做一个select语句,从他们那里得到所有练习。元组(名称、创建者)匹配的所有行都被称为属于同一训练。子项应引用父项,反之亦然:
create table client (
id serial primary key
);
create table workout (
id serial primary key,
name varchar,
creator int references client(id)
);
create table exercise (
id serial primary key,
workout int references workout(id)
);
然后,给定训练的列表视图可能如下所示:
select *
from workout w
left join exercise e on e.workout = w.id
where name = 'some name';
编辑。对于多对多关系,常用的方法是创建所谓的联接表,例如:
create table workout_parts (
workout int references workout(id),
exercise int references exercise(id),
primary key (workout, exercise)
);
对不起,也许我写帖子的时候有点快。锻炼不一定是锻炼的一部分。用户应该能够创建一些练习,如果他/她愿意,只需将一些练习分组作为训练。同一项运动应该也可以是几种不同运动的一部分。可能是一张简单的运动表、一张运动表和一张第三张运动表exercisensunwork(锻炼参考锻炼(id)、锻炼参考锻炼(id));我明白了,你会成功的。然而,在表中一个对象有几行是很奇怪的
workout
。看到编辑过的答案。刚刚看到你的编辑,你在我发表评论一秒钟后发布了它。我考虑了一会儿,它可能会起作用。我现在觉得很愚蠢,因为我从一开始就没有考虑这个问题。
create table workout_parts (
workout int references workout(id),
exercise int references exercise(id),
primary key (workout, exercise)
);