Мне действительно нужно иметь идентификатор для дочерней таблицы в рельсах, использующих активные записи? - PullRequest
0 голосов
/ 19 сентября 2010

У меня есть пользовательская модель (таблица sql), которая имеет профиль: профили имеют user_id для ссылки на объект пользователя. Мне действительно нужен столбец profile_id?

Каковы преимущества и недостатки? Я предполагаю, что одним из преимуществ будет размер таблицы, который будет на 1 столбец меньше. Какие недостатки?

Ответы [ 4 ]

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

Нет.Вам не нужен идентификатор.Но вам нужен первичный ключ, который может быть другим столбцом в таблице.Естественно, первичный ключ означает, что значение должно быть уникальным, а не нулевым.

Просто создайте таблицу без столбца id:

create_table "profiles", :id => false, primary_key => 'user_id' do |t|
  t.integer "user_id"
  #...
end

Затем в модели:

class Profile < ActiveRecord::Base
  set_primary_key 'user_id'
end

Таблицане должен быть создан автоинкремент или секвенсор - просто проверьте это.Значение должно быть установлено вами или платформой, если вы используете метод ассоциации (user.profile.create(...)).

Недостатки: Некоторые плагины могут ожидать, что «id» будет PK, но это означает, что они плохо написаны.

0 голосов
/ 19 сентября 2010

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

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

0 голосов
/ 19 сентября 2010

Ваша таблица профилей не нуждается в столбце profile_id. У него уже есть id и belongs_to User, поэтому все, что вам нужно, это user_id в таблице профилей. Внешний ключ (идентификатор объекта, которому принадлежит профиль) следует belongs_to.

Profile has_one :user
User belongs_to :profile
# User table includes its own id ('id') and profile_id for the belongs_to

User has_one :profile
Profile belongs_to :user
# Profile table includes its own id ('id) as well as user_id for the belongs_to
0 голосов
/ 19 сентября 2010

При наличии в профиле ассоциации belongs_to :user, если вы хотите, чтобы эта ассоциация была доступна при следующей загрузке объекта из базы данных, вам лучше сохранить user_id в таблице profiles.Там действительно нет другого пути.Однако вам, конечно, не нужен столбец profile_id для противоположной ассоциации.Rails достаточно умен, чтобы смотреть в таблицу profiles при интерпретации ассоциации User * has_one :profile.

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

Существуют некоторые недостатки наличия profile_id колонка, кстати.Насколько мне известно, Rails даже не обновит столбец автоматически, если вы переназначите атрибут profile для a User.Такое поведение характерно для belongs_to ассоциации.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...