Наиболее разумным моментом для использования этого было бы наличие двух отдельных концепций, которые могли бы быть связаны только таким образом. Например, у Автомобиля может быть только один текущий Водитель, а Водитель может управлять только одним автомобилем за раз, поэтому отношение между концепциями Автомобиля и Водителя будет 1: 1. Я согласен с тем, что это надуманный пример, демонстрирующий точка.
Другая причина в том, что вы хотите по-разному специализировать концепцию. Если у вас есть таблица Person и вы хотите добавить концепцию различных типов Person, таких как Сотрудник, Клиент, Акционер - для каждого из них потребуются разные наборы данных. Сходные данные между ними будут в таблице Person, специальная информация будет в конкретных таблицах для клиентов, акционеров и сотрудников.
Некоторым движкам баз данных сложно эффективно добавить новый столбец в очень большую таблицу (много строк), и я видел таблицы расширения, которые использовались для хранения нового столбца, а не нового столбца, добавляемого в исходную таблицу. Это одно из наиболее подозрительных применений дополнительных таблиц.
Вы также можете разделить данные для одной концепции между двумя разными таблицами из-за проблем с производительностью или удобочитаемостью, но это достаточно частный случай, если вы начинаете с нуля - эти проблемы проявятся позже.
Во-первых, я думаю, что это вопрос моделирования и определения того, что представляет собой отдельный объект. Предположим, у вас есть
customers
только один синглaddress
. Конечно, вы можете реализовать все в одной таблицеcustomer
, но если в будущем вы позволите ему иметь 2 или более адресов, вам нужно будет провести рефакторинг (это не проблема, но принять осознанное решение).Я также могу вспомнить интересный случай, не упомянутый в других ответах, где может быть полезно разделение таблицы:
Представьте, опять же, у вас есть
customers
по одномуaddress
адресу, но на этот раз иметь адрес необязательно. Конечно, вы можете реализовать это какNULL
набор столбцов с возможностью выбора, напримерZIP,state,street
. Но предположим, что, учитывая, что у вас есть адрес, состояние не является необязательным, а ZIP-файл. Как смоделировать это в одной таблице? Вы можете использовать ограничение дляcustomer
таблицы, но гораздо проще разделить ее в другой таблице и сделать foreign_key NULLable. Таким образом, ваша модель гораздо более четко говорит, что сущностьaddress
является необязательной, и чтоZIP
это необязательный атрибут этой сущности.источник
За время программирования я столкнулся с этим только в одной ситуации. Это когда между одними и теми же двумя объектами («Сущность A» и «Сущность B») существует отношение «1 ко многим» и «1 к 1».
Когда «Entity A» имеет несколько «Entity B», а «Entity B» имеет только 1 «Entity A», а «Entity A» имеет только 1 текущую «Entity B», а «Entity B» имеет только 1 «Entity A».
Например, у автомобиля может быть только один текущий водитель, а водитель может управлять только одним автомобилем за раз - поэтому соотношение между концепциями автомобиля и водителя будет 1 к 1. - Я позаимствовал этот пример из ответа @Steve Fenton
Если водитель может управлять несколькими машинами, но не одновременно. Таким образом, сущности «Автомобиль» и «Водитель» относятся к категории «один ко многим» или «многие ко многим». Но если нам нужно знать, кто является текущим драйвером, нам также понадобится соотношение 1 к 1.
источник
Другой вариант использования может заключаться в превышении максимального количества столбцов в таблице базы данных. Затем вы можете присоединиться к другому столу с помощью OneToOne
источник