2010-10-27 4 views
4

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

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

Любая помощь или предложения были бы высоко оценены, и извините, если эти вопросы глупы!

ответ

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; 
+0

Огромное спасибо, ваш ответ и объяснение получили ясную помощь! – BeeDog

1

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

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

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

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

Что относительно отпуска?

+0

Спасибо за помощь!Я действительно не думал об отпуске или подобном, но спасибо, что напомнил мне об этом. :) – BeeDog

Смежные вопросы