Подтвердить что ты не робот

Когда использовать отношения 1-к-1 между таблицами базы данных?

Вопрос проектирования БД: когда вы решите использовать таблицы отношений 1 к 1?

Одно из мест, которое я вижу это, например, когда у вас есть таблица User и UserProfile, люди делят их, а не помещают все столбцы только в таблицу User.

Технически вы можете просто поместить все столбцы в одну таблицу, так как их отношение равно 1 к 1.

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

Итак, если мне нужно создать таблицу User и таблицу UserProfile, лучше ли мне просто сделать это в одной таблице?

4b9b3361

Ответ 1

Единственный раз, когда я использовал отношения от 1 до 1, - это когда я хочу, чтобы он политически принадлежал нескольким объектам.

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

Ответ 2

Подумайте о том, как вы будете проектировать бизнес-объекты. У вас будет объект User с 50 свойствами на нем или у вас будет объект User с несколькими подробными свойствами, а затем объект Profile, который содержит другие данные для профиля?

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

Также это может облегчить поиск. Не многие вещи я ненавижу больше, чем просматривать таблицу с 75 столбцами.

Ответ 3

Классическая причина заключается в том, чтобы избежать столбцов с нулевым значением.

Наличие значения NULL в столбце может затруднить запись четкого (поддерживаемого) SQL. @Ovid написал об этом здесь, опираясь на работу Chris Date.

Ответ 4

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

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

Ответ 5

Это прямая копия и вставка из другого вопроса, который появился сегодня в этой теме, но он также здесь полезен. Есть ли время, когда использование отношения базы данных 1:1 имеет смысл?

Я использую их в основном по нескольким причинам. Один из них - значительные изменения в скорости изменения данных. В некоторых моих таблицах могут быть аудиторские следы, где я отслеживаю предыдущие версии записей, если мне нужно только отслеживать предыдущие версии из 5 из 10 столбцов, разделяющих эти 5 столбцов на отдельную таблицу с механизмом аудиторского следа на нем, более эффективно. Кроме того, у меня могут быть записи (скажем, для бухгалтерского приложения), которые пишут только. Вы не можете изменить суммы в долларах или их учетную запись, если вы допустили ошибку, тогда вам нужно сделать соответствующую запись для записи, отрегулировать неправильную запись, а затем создать запись с исправлением. У меня есть ограничения на таблицу, подтверждающие, что они не могут быть обновлены или удалены, но у меня может быть несколько атрибутов для этого объекта, которые являются податливыми, которые хранятся в отдельной таблице без ограничения на модификацию. В другой раз я делаю это в медицине. Существуют данные, связанные с посещением, которые не могут быть изменены после его подписания, а также другие данные, связанные с посещением, которые могут быть изменены после подписания. В этом случае я разделил данные и поместил триггер в заблокированную таблицу, отклонив обновления в заблокированную таблицу при ее выгрузке, но разрешив обновление данных, которые врач не подписывает.

Другой плакат прокомментировал 1:1, не будучи нормализованным, я бы не согласился с этим в некоторых ситуациях, особенно подтипов. Скажем, у меня есть таблица сотрудников, а первичный ключ - это их SSN (это пример, дайте возможность сохранить дискуссию о том, является ли это хорошим ключом или нет для другого потока). Сотрудники могут быть разных типов, например, временные или постоянные, и если они постоянны, у них есть больше полей для заполнения, например номер офисного телефона, который должен быть не равен нулю, если тип = 'Постоянный'. В третьей базе данных нормальной формы столбец должен зависеть только от ключа, то есть от сотрудника, но на самом деле это зависит от сотрудника и типа, поэтому соотношение 1:1 совершенно нормально и желательно в этом случае. Он также предотвращает чрезмерно разреженные таблицы, если у меня есть 10 столбцов, которые обычно заполняются, но 20 дополнительных столбцов только для определенных типов.

Ответ 6

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

Вторая таблица имела треть строк, но в три раза больше столбцов.

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

Однако, если вы делаете это сейчас, я соблазнюсь не беспокоиться. Живите с пустым пространством. Эта проблема может привести к разработке приложений просто не стоит, а пространство дешевле, чем время разработки.

Ответ 7

Это было хорошо рассмотрено, но я просто добавлю короткую заметку, чтобы прояснить то, что не было очевидно для меня, и не было четко указано. От 1 до 1 отношения не означает, что для каждой записи в таблице A в таблице B имеется 1 соответствующая запись. Вместо этого это означает, что для каждой записи в таблице A в таблице B будет 0 или 1 соответствующих записей.

Шейн Д. и другие описывают сценарии, которые используют этот факт.

Ответ 8

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

Итак, если мы поддерживаем одну таблицу как решение. Мы выполняем частые обновления в этой таблице и будем обновлять только 5 столбцов по 50. Я чувствую, что каждое обновление нарушает распределение строк, и существует высокая вероятность цепочек строк, поэтому, чтобы избежать объединения строк, я следовал за подходом к разделению данных на основе DML-активности.

Сообщите мне, если какое-либо лучшее решение