我应该如何构建我的MySQL数据库?

时间:2010-10-27 13:44:37

标签: mysql database database-design

首先,对不起,如果这可能是一个愚蠢的问题。我对MySQL的世界很新,所以......

无论如何,我的问题是这样的:我打算建立一个处理(现在)两类用户的数据库,假设管理员用户。我的目标是让一个包含所有用户的表,恰当地命名为“users”。下面是我的MySQL命令的大致轮廓(我还没有测试过,所以可能存在错误):

CREATE TABLE users {
 user_id  int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
 user_type  int NOT NULL REFERENCES user_types(user_type_id),
 ssn      char(10) NOT NULL,
 password  varchar(40) NOT NULL,
 first_name  varchar(30) NOT NULL,
 last_name varchar(30) NOT NULL,
 address     varchar(80) NOT NULL
} engine = InnoDB;

上面的“user_type”列将引用另一个名为“user_types”的表,该表列出了网站的不同用户类型(我这样做是为了以后可以选择添加更多用户类型):< / p>

CREATE TABLE user_types {
   user_type_id     int UNSIGNED NOT NULL PRIMARY KEY,
   user_type_desc varchar(10) NOT NULL
} engine = InnoDB;

INSERT INTO user_types (user_type_id, user_type_desc) VALUES(1,'Admin'),(2,'User');

我的目标是将“用户”与“管理员”相关联;一个“用户”(孩子)可以有一个“管理员”(父母),但一个“管理员”(父母)可以有几个“用户”关联(孩子)。我的目标是创建一个简单的约会日历,为此我需要将用户与他们的管理员联系起来(在一个用户和一个管理员之间约会的意义上是一对一的关系)。现在的问题是:

1)是否可以通过为所有用户提供一个表来实现这一目标?如果是这样,我该如何以良好的方式做到这一点?现在我正在考虑创建一个名为“赋值”的表:

CREATE TABLE assignments {
assign_id int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
patient_id int NOT NULL REFERENCES users(user_id),
doctor_id int NOT NULL REFERENCES users(user_id)
} engine = InnoDB;

但上面的代码对我来说很奇怪;我可以将那种外键链接到同一个表而没有任何危险吗?下面是“约会”表的SQL'代码':

CREATE TABLE appointments {
appointment_id int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
assign_id     int FOREIGN KEY REFERENCES assignments(assign_id),
date_time     datetime NOT NULL,
description     varchar(200) NOT NULL
};

也就是说,“约会”表中的每个条目都指向“管理员”和“用户”之间的某个分配。

2)我如何以简单的方式,或者更确切地说,以正确的方式实现“管理员”和“用户”之间的一对多关系?

如果这些问题很愚蠢,我们将非常感谢您的帮助或建议!

2 个答案:

答案 0 :(得分:1)

如果您在用户和管理员之间存在多对多关系,则建议的分配表将起作用。由于您已将关系描述为1对多(一个Admin可能有很多用户),因此我只需将admin_id列添加到users表中,并将其作为自引用外键返回到users表。

CREATE TABLE users {
 user_id  int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
 user_type  int NOT NULL REFERENCES user_types(user_type_id),
 ssn      char(10) NOT NULL,
 password  varchar(40) NOT NULL,
 first_name  varchar(30) NOT NULL,
 last_name varchar(30) NOT NULL,
 address     varchar(80) NOT NULL,
 admin_id int REFERENCES users(user_id)
} engine = InnoDB;

答案 1 :(得分:1)

在users表中添加引用用户(user_id)

的admin_userid

这样,每个用户都会向用户表指向他们所属的管理员用户。

使用此专栏,医生可以列出他的所有患者,并且可以在约会时使用分配表。

但某个用户是否总是会与同一位医生/管理员会面?

假期怎么样?