好的,我有一个正在进行的网站,允许用户使用提供的练习列表构建例程。他们可以将一些练习添加到他们将创建并自我标题的例程中。
所以我想我应该有一个用户表。 每个用户都有许多例程。 每个例程都会进行一些练习。
因此我将有3个表:用户,例程和练习
BUT
我如何链接'例程'和'练习',因为'例程'将不得不多于一个表,因为如果你想象一个用户创建“二头肌”例程并用练习填充它。然后他创造了“三头肌”并用练习填充它。然后他必须有两个名为“二头肌”和“三头肌”的常规表。
那么我如何构建我的数据库以适应这个?
请记住每个用户都有一个唯一的ID 每项运动都有一个唯一的ID 每个例程都有一个唯一的ID。
答案 0 :(得分:3)
您不希望有两个routines
表
您需要一个 routines
表,以及一个引用exercises
表的routines
表。
根据一个例程对于所有用户是否相同,或者每个用户是否可以拥有自己的“二头肌”例程版本,可能还需要一个表。
看看下面的例子!
示例1(每个用户都可以拥有自己的“二头肌”例程):
用户表:
UserId Name
----------------
1 Joe
2 Bill
例程表:
RoutineId Name UserId
-------------------------------
1 biceps 1
2 biceps 2
练习表:
ExerciseId RoutineId Name
--------------------------------------------------------
1 1 first exercise of routine 1
2 1 second exercise of routine 1
3 2 first exercise of routine 2
4 2 second exercise of routine 2
示例2(只有一个“二头肌”例程,所有用户都一样):
用户表:
UserId Name
----------------
1 Joe
2 Bill
例程表:
RoutineId Name
------------------
1 biceps
用户< - >例程链接表:
UserId RoutineId
--------------------
1 1
2 1
练习表:
ExerciseId RoutineId Name
--------------------------------------------------------
1 1 first exercise of routine 1
2 1 second exercise of routine 1
修改强>
你说:
是的,例程对每个用户都是私有的,因为他们创建它们。它们不共享
和
每次练习都应该能够使用不止一次。即我可能在我的“背部锻炼”例程和我的“手臂锻炼”例程中进行“拉起”练习
最终解决方案:
用户表:
UserId Name
----------------
1 Joe
2 Bill
例程表:
RoutineId Name UserId
-----------------------------------------------------
1 Joe's back workout 1
2 Joe's arm workout 1
3 Bills's back workout 2
“全球”练习表:
ExerciseId Name
--------------------------------------------------------
1 pull up
2 whatever
常规< - >练习链接表:
RoutineId ExerciseId
----------------------------------
1 2
2 1
3 1
这样,“拉起”练习在Joe的手臂训练(例行2)和Bills的背部训练(例程3)中,但不在Joe的背部训练(例程1)中。 “无论如何”的例行程序仅在Joe的背部训练(例行1)中。
这是你想要的吗?
答案 1 :(得分:1)
create table users(
userid int not null AUTO_INCREMENT PRIMARY KEY,
firstname char(30) not null,
lastname char(30) not null
);
create table routines(
rid int not null AUTO_INCREMENT PRIMARY KEY,
userid int not null,
rname char(30) not null
);
create table execises(
eid int not null AUTO_INCREMENT PRIMARY KEY,
rid int not null,
ename char(30) not null
);