Должен ли я добавить «index» ко всем внешним ключам, таким как «xxx_id»?
Было бы лучше, потому что это ускоряет поиск при сортировке в этом столбце. И внешние ключи - это то, что ищут много.
Начиная с версии 5 рельсов, индекс будет создан автоматически, для получения дополнительной информации см. здесь .
Должен ли я добавить «index» в автоматически созданный столбец «id»?
Нет, это уже сделано рельсами
Должен ли я добавить «index (unique)» в автоматически созданный столбец «id»?
Нет, как и выше
Если я добавлю индекс к двум внешним ключам одновременно (add_index (:users, [:category_id, :state_id])
, что произойдет? Чем это отличается от добавления индекса для каждого ключа?
Тогда индекс представляет собой объединенный индекс двух столбцов. Это не имеет никакого смысла, если только вы не хотите, чтобы все записи для одного category_id
И одного state_id
(это должно быть category_id
не category
) одновременно.
Такой индекс ускорит выполнение следующего запроса:
# rails 2
User.find(:all, :conditions => { :state_id => some_id, :category_id => some_other_id })
# rails 3
User.where(:state_id => some_id, :category_id => some_other_id)
Где
add_index :users, :category_id
add_index :users, :state_id
ускорит эти запросы:
# rails 2+3
User.find_by_category_id(some_id)
User.find_by_state_id(some_other_id)
# or
# rails 2
User.find(:all, :conditions => {:category_id => some_id})
User.find(:all, :conditions => {:state_id => some_other_id})
# rails 3
User.where(:category_id => some_id)
User.where(:state_id => some_other_id)
Я должен добавить «индекс с уникальным» для xxx_id, верно?
Нет, потому что если вы сделаете это, только один пользователь может быть в одной категории, но значение категории состоит в том, что вы можете поместить больше много пользователей в одну категорию. В вашей модели User
у вас есть что-то вроде belongs_to :category
, а в модели вашей категории что-то вроде has_many :users
. Если у вас есть отношение has_many
, поле foreign_key
не должно быть уникальным!
Для получения более подробной информации об этом вы должны взглянуть на tadman 's great answer .