Как мне структурировать базу данных MySQL? - PullRequest
4 голосов
/ 27 октября 2010

Прежде всего, извините, если это глупый вопрос. Я очень новичок в мире MySQL, так что ...

В любом случае, мой вопрос таков: я планирую создать базу данных, которая будет (на данный момент) иметь дело с двумя типами пользователей, скажем, Администраторы и Пользователи . Моя цель состоит в том, чтобы иметь ОДИН стол, содержащий всех пользователей, метко названных «пользователи». Ниже приведена приблизительная схема моей команды 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», в которой перечислены различные типы пользователей для веб-сайта (я делаю это для того, чтобы иметь возможность добавить больше типов пользователей позже):

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 ]

1 голос
/ 27 октября 2010

В таблице пользователей добавьте admin_userid, который ссылается на пользователей (user_id)

Таким образом, каждый пользователь указывает на таблицу пользователей на пользователя admin, которому он принадлежит.

Используя эту колонку врачомможет перечислить всех своих пациентов, и таблица назначений может использоваться с назначениями.

Но будет ли определенный пользователь ВСЕГДА встречаться с тем же врачом / администратором?

А как насчет отпуска?

1 голос
/ 27 октября 2010

Ваша предлагаемая таблица назначений будет работать, если у вас будут отношения «многие ко многим» между пользователями и администраторами.Поскольку вы описали отношение «1-ко-многим» (у одного администратора может быть много пользователей), я просто добавил бы столбец admin_id в таблицу пользователей и сделал бы его внешним ссылочным ключом обратно в таблицу пользователей.*

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...