В реляционной СУБД, когда отношение является взаимно-однозначным, помогает ли это, если обе записи указывают друг на друга, или одна указка уже достаточно (нет необходимости указывать обе)? - PullRequest
2 голосов
/ 05 сентября 2010

Я читал книгу, в которой говорится, что у User есть еще UserDetail, поэтому у UserDetail будет user_id, указывающий на таблицу пользователей. Я вроде как забыл, это помогает вообще иметь поле в таблице Users, чтобы иметь user_detail_id для указания на запись UserDetail?

Это так и в Ruby on Rails, что таблица Users не имеет user_detail_id, а таблица UserDetail имеет user_id. И модель User использует has_one :user_detail, а модель UserDetail использует belongs_to :user.

В некотором смысле имеет смысл, что если это отношение один ко многим, то на стороне «Много» мы имеем foreign_id, указывающий назад на сторону «Один», но сторона «Один» Не нужно указывать на сторону «Многие», поэтому, похоже, что один-к-одному не нужно, чтобы он указывал в обе стороны, так как одной стороны достаточно.

Ответы [ 4 ]

2 голосов
/ 05 сентября 2010

на стороне «Много», у нас есть Foreign_id, указывающий на сторону «Один», но стороне «Один» не нужно указывать на сторону «Многие», поэтому он выглядит какодин-к-одному не нужно, чтобы он тоже указывал в обе стороны, так как одной стороны достаточно.

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

Но я думаю, что вы понимаете, почему вы вообще не моделируететаблицы в отношениях один к одному.Это создает бессмысленные накладные расходы путем дублирования первичного ключа в качестве внешнего ключа (как минимум) и включает ограничение внешнего ключа в качестве дополнительного багажа.Таблицы «один-к-одному» используются для решения проблем производительности;если нет проблем с производительностью, это преждевременная оптимизация ...

2 голосов
/ 05 сентября 2010

Это верно, с точки зрения внешних ключей, отношения должны быть установлены только для одного направления. Обратите внимание, что ассоциации ActiveRecord в Rails позволяют проходить ассоциации с любого конца. Например:

@user.user_detail

# Or
@user_detail.user
2 голосов
/ 05 сентября 2010

Это не очень хорошая идея, что бы вы сделали, если бы хотели удалить строку? Вам нужно отключить ограничение!

1 голос
/ 05 сентября 2010

В случае «один-к-одному» вы можете думать об этом точно как о «один-ко-многим», за исключением того, что часть «многие» всегда будет «одна». С учетом вышесказанного, наличие внешнего ключа на стороне «много» будет достаточно хорошим, и нет необходимости в двойном указании. Это так просто.

...