我应该如何构建我的数据库以停止拥有这么多表?

时间:2012-11-13 21:24:14

标签: mysql database-design relational-database

好的,我有一个正在进行的网站,允许用户使用提供的练习列表构建例程。他们可以将一些练习添加到他们将创建并自我标题的例程中。

所以我想我应该有一个用户表。 每个用户都有许多例程。 每个例程都会进行一些练习。

因此我将有3个表:用户,例程和练习

BUT

我如何链接'例程'和'练习',因为'例程'将不得不多于一个表,因为如果你想象一个用户创建“二头肌”例程并用练习填充它。然后他创造了“三头肌”并用练习填充它。然后他必须有两个名为“二头肌”和“三头肌”的常规表。

那么我如何构建我的数据库以适应这个?

请记住每个用户都有一个唯一的ID 每项运动都有一个唯一的ID 每个例程都有一个唯一的ID。

2 个答案:

答案 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
);