2016-12-31 5 views
0

У меня есть две таблицы: Student & пользователя
Student таблица имеет первичный ключ INT (9)
User таблица имеет первичный ключ MEDIUMINTвнешний ключ из двух возможных таблиц

Теперь, пожалуйста, посмотрите на эту картину

Social_Network

Теперь проблема: в messages таблице я имею в messageFrom и messageTo COLS, я не знаю, погода отправителя или приемник является Student или пользователя.

Я не могу ссылаться на две таблицы из-за разных типов первичных ключей, однако стараюсь избегать серьезных изменений, насколько это возможно.
та же проблема есть везде информацияпоты таблица, комментарий таблица. Везде.

КАК обойти эту проблему или возможные решения для ее устранения?

И пожалуйста, не стесняйтесь Обратная связь Структура базы данных, я хотел бы узнать и узнать из ваших советов.

благодарит заранее.

ответ

1

Оба пользователя и учащиеся (сущности, а не таблицы) являются примерами Люди. Существуют атрибуты Пользователей, которые не принадлежат Студентам, и есть атрибуты Студентов, которые не принадлежат Пользователям. Кроме того, есть действия, которые пользователи могут принять, что студенты не могут принять и наоборот. Тем не менее, есть атрибуты, общие для обоих (имя, адрес, номер телефона и т. Д.), А также действия, которые могут выполняться (отправлять/получать сообщения, оставлять комментарии и т. Д.). Это сильно подразумевает отдельную таблицу, которая содержит общие атрибуты и допускает общие действия.

create table People(
    ID  MediumInt auto_generating primary key, 
    PType char(1) not null check(PType in('U', 'S')) -- User or Student 
    Name varchar(64) not null, 
    Address varchar(128), 
    ...,  -- other common attributes 
    constraint UQ_PeopleIDType unique(ID, PType) -- create anchor for FKs 
); 

create table Users(
    UserID MediumInt not null primary key, 
    UType  char(1) check(UType = 'U'), 
    ...,  -- attributes for Users 
    constraint FK_Users_People foreign key(UserID, UType) 
    references People(ID, PType) 
); 

create table Students(
    StudentID MediumInt not null primary key, 
    SType  char(1) check(SType = 'S'), 
    ...,  -- attributes for Students 
    constraint FK_Students_People foreign key(StudentID, SType) 
    references People(ID, PType) 
); 

Обратите внимание, что если человек создается с типом «S» (Student), то значение идентификатора для этого человека может быть вставлен только в таблицу Student.

Теперь все таблицы, которые должны относиться к Пользователям, могут быть FK для таблицы Users, а те, которые должны относиться к учащимся, могут быть FK в таблице Students. Когда таблицы могут ссылаться на них, они могут FK для таблицы People.

0

Внешние ключи не решают всех проблем. Добавьте подходящий индекс вместо зависимости от FK. Тогда:

План А: Есть ли эквивалент FK проверки в коде приложения или

Plan B: Forgo любые проверки FK.

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

  • Нет связанных вопросов^_^