2015-03-25 2 views
1

У меня есть таблица пользователей, в которой хранятся сведения о двух типах пользователей, а именно о студентах и ​​преподавателях. Есть 10 полей, таких как имя пользователя, пароль и т. Д., Общий для студентов и преподавателей. В случае каких-либо данных здесь нет 1-го отношения.База данных дизайна для отношений 1 к 1, когда некоторые столбцы применимы только в определенных случаях

В случае студентов, я должен хранить двадцать разные 1 до 1 данных, таких как вес, DOB, Admission No., Родитель, номер телефона и т.д.

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

Какая лучшая структура базы данных, которую я могу использовать в этом сценарии снизу? Если есть лучшие варианты, укажите это тоже.

  1. Одна таблица с 50 столбцами, где 20 столбцов будут иметь значение NULL в случае студентов и 20 столбцов будут иметь значение NULL в случае учителей

  2. Одна таблица с 30 столбцами, где первые 10 столбцов хранит общие данные и следующие 20 столбцов хранят детали учащихся в случае студентов и данных учителя в случае учителя.

  3. Две таблицы с 10 колонками для хранения сведений о пользователе. И еще одна таблица с 20 столбцами для хранения сведений о студентах в случае обучения студентов и преподавателей в случае учителя.

  4. Три таблицы с 10 колонками для хранения сведений о пользователе. Другой стол с 20 колонками для хранения сведений о студентах и ​​еще один стол с 20 столбцами для хранения данных учителя

+5

вариант 4., это классический супер/подтип. – dean

+3

опция 4, без сомнения. Подумайте об этом с объектно-ориентированной точки зрения - таблица с 10 столбцами - это базовый объект, а таблицы учеников и учителей - это производные объекты. –

+0

Вариант 4 является наиболее нормализованным, но в зависимости от использования я бы рассмотрел денормализацию для двух таблиц с 30 столбцами каждый. Один стол для студентов, один для учителей. Первые 10 столбцов обеих таблиц будут одинаковыми. –

ответ

0

Наследование отдельных таблиц и наследование классов классов являются прекрасными. Фактически, Фаулер рекомендовал ИППП для гибкого. И если вы используете хороший ORM, как Hibernate, разница тривиальна. Если вы используете PostgreSQL, ваши нули не будут занимать лишнего места.

Это означает, что вы должны нормализовать свои таблицы (например, телефон-телефон родителей должен быть в таблице разностей). См. https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831 для некоторой помощи

0

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

лучше, чтобы иметь выбора 4 таблицы:

1) For a base person details (columns teachers and students both have). 
2) A teacher table for details that pertain to only teachers. This will relate to base person table with a foreign key (just like table 3). 
3) A student table for details that pertain to only students. 

Нет дополнительных пустых столбцов и очень гибкий в виде запросов (некоторые из которых, что вы не предвидя) вы сможете сделать.

+0

Вы говорите «4 таблицы», но перечисляете только 3 ?? –

+0

Я имел в виду выбор 4. Но вы можете создать таблицу для многих, потому что у данного ученика может быть много учителей. И у каждого учителя может быть много учеников. –

0

Первое, что я думал о связи уха свиней, объекте связи, чтобы вы могли иметь идентификатор, teacherID, studentID, чтобы показать, какие учителя учат, какие студенты, но потом я понял, что это не то, о чем вы просили ...

Почему бы просто не иметь единственное логическое, истинное, если учитель, ложное, если нет?

0

Посмотрите эти две метки:

Они соответствуют хорошо известные способы, которые, как вариант 1 и вариант 4. Есть ситуации, в которых один или другой из них лучше. Тег wikis (info) и вопросы, сгруппированные по тегам, предоставят вам дополнительную помощь.

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