Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用列表行为设计SQL表_Sql_Database_Postgresql - Fatal编程技术网

使用列表行为设计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)
);