MySQL — резервирование диапазона идентификаторов для дочерних объектов для каждого родительского объекта

#mysql #ruby-on-rails #activerecord

#mysql #ruby-on-rails #activerecord

Вопрос:

У меня есть компании, и у каждой компании есть несколько продуктов. Модели имеют следующее отношение-

класс Company < ActiveRecord::Base has_many :конечные продукты класс Products < ActiveRecord::Base belongs_to:конечная компания

Я хочу зарезервировать 1000 идентификаторов продуктов для каждой компании.

Итак

  • Компания1 может иметь идентификаторы продуктов от 1 до 1000
  • Компания2 может иметь идентификаторы продуктов от 1001-2000

Я хочу зарезервировать ПЕРВИЧНЫЕ ключи таблицы продуктов для каждой компании вместо того, чтобы иметь ограниченный первичный ключ и повторяющиеся идентификаторы (потому что потребитель / компания может запомнить идентификатор продукта и получить к нему доступ, используя url ‘…/product / 1000’).

Решение, которое я имею в виду — должен ли я создавать несколько последовательностей (по одной для каждой компании по мере создания компании). Со значением по умолчанию как (Company.ИДЕНТИФИКАТОР -1) * 1000 1. И используйте nextval для этой последовательности, когда продукт создается для компании 1. Я уверен, что у компании не будет 1000 продуктов в системе (маловероятно).

Можете ли вы предложить лучший подход?

Комментарии:

1. Почему вы хотите это сделать? Просто выполните обычное has_many <-> принадлежит ассоциации

2. Там уже есть has_many и принадлежит ассоциации. Компании будет легко получить доступ к продуктам. Мы показываем идентификатор продукта везде в приложении (у него нет имени).

Ответ №1:

Ваш план не очень хорош. Если у вас 50 компаний по 5 продуктов в каждой, теперь у вас в базе данных 50 000 строк. Базы данных постоянно сталкиваются с такими проблемами. Не рассчитывайте на то, что ваши клиенты запомнят идентификаторы базы данных. Упростите им поиск идентификаторов.

Вы должны организовать свою модель в rails следующим образом:

 class Company < ApplicationRecord
  has_many :products
end
class Products < ApplicationRecord
  belongs_to :company
end
 

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

Комментарии:

1. Ассоциация есть. Продукты не имеют имен и идентифицируются по идентификаторам, и мы показываем идентификатор в пользовательском интерфейсе по всей системе. Продукт идентифицируется слишком многими параметрами, и я не могу сделать из него имя (пользователи уже хорошо разбираются в идентификации продуктов по идентификаторам)…

2. Как вы обращаетесь к компании со 1001 продуктом?

3. Вероятно, мне нужно назначить ему следующий доступный блок идентификаторов… У меня нет идеального решения, поэтому я ищу указатели. Это требование бизнеса. 🙁