@kofon
Я человек

SQL. Нужно ли создавать отдельную таблицу?

Есть БД - детский сад.

Таблицы: Child, Parent. У них есть одинаковые свойства - это ФИО, всё остальное разное (родитель: данные паспорта, место работы..., ребёнок: номер группы, мед. книжка...)

Так вот, стоит ли создавать отдельную таблицу наподобие Person, куда вставить ФИО и создать связь один к одному для таблиц Child и Parent?

Или всё-таки продублировать данные в обеих таблицах?

Тогда что, если появится Employee (работник) тоже с ФИО, и там дубляж?
  • Вопрос задан
  • 1659 просмотров
Пригласить эксперта
Ответы на вопрос 3
@tihhanovski
Вообще, в реальной жизни у родителя и ребенка фамилии могут быть разные, мне кажется, что person, там фио и все такое (причем может быть стоит подумать о том, что будет, если человек поменяет фамилию, как организовать историю, если это надо).
Вместо child-parent можно сделать некую parentof(c полями parentId, childId).
Вместо employee - employementcontract - где employeeid - foreign key к person
Ответ написан
VladimirAndreev
@VladimirAndreev
php web dev
имхо: для фамилий, имен и отчеств замутить вообще 3 отдельные таблицы и их связать по ИД со всеми.
Ответ написан
tihhanovski вам дело говорит. Это полная лажа - таблицы Child и Parent. В чем их смысл? Каждая таблица (т.е. отношение, говоря математическим языком) - эти некий факт, который может быть истинным для некоторой комбинации атрибутов (и тогда запись в таблице существует), либо не быть истинным (и тогда записи в таблице нет). В чем суть фактов "Ребенок" или "Родитель"? И в том и в другом случае это человек. Т.е. для хранения сведений о человеке нужна только одна таблица, и это таблица Person.

Другое дело, что вы хотите еще хранить сведения о том, кто кому приходится родителем. Поля ParentId в таблице Person будет недостаточно, т.к. зарегистированный родитель может быть один, а может быть двое (или даже ни одного, если в вашем детсаду могут быть сироты). Можно конечно завести два поля - первый родитель и второй родитель, и давать возможность ставить туда NULL, но не факт что это лучшее решение. Вот для целей хранения связи родитель-ребенок (обращаю ваше внимание, что именно СВЯЗИ родитель-ребенок, а не отдельных сущностей "родитель" и "ребенок") можно завести отдельную таблицу вида Parent(ChildId, ParentId), где оба поля - это внешние ключи в таблицу Person и оба поля формируют составной первичный ключ. Тогда вы сможете спокойно заносить и детей и родителей в одну таблицу, а затем связывать их родственными отношениями - у одного ребенка может быть 0, 1 и более родителей (ограничение в 2 человека нужно будет контролировать на уровне приложения), и каждый родитель может иметь любое число детей.

P.S. По поводу того, что данные разные в Child и Parent - дело не в том, что ФИО надо выносить, а в том, что надо отделить общие данные о человеке, и оставить их в таблице Person (кстати, пол человека вы наверняка захотите хранить в Person), а различающиеся данные разместить в других таблицах, например МестоРаботы и МедицинскиеСведения. То, что у родителей есть место работы, а у детей - мед. сведения, это, грубо говоря, стечение обстоятельств. Завтра вам скажут, что медицинскую информацию и для родителей тоже нужно хранить (например, если они посещают здание детсада). Один-два джоина - это более чем адекватный запрос в нормальной нормализованной БД.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы