#ruby-on-rails #database #sqlite #database-design #postgresql
#ruby-on-rails #База данных #sqlite #database-design #postgresql
Вопрос:
Мне нужно создать таблицу истории для конкретного ресурса, и я пытаюсь решить, как ее спроектировать. Моя текущая мысль заключалась в том, чтобы создать отдельную таблицу для каждого экземпляра ресурса и вводить новое значение всякий раз, когда нужно что-то добавить. Это было бы быстрее? Или я должен попытаться поместить все в одну таблицу и выполнить поиск по ней? Я пока не слишком уверен, как поместить это в одну таблицу, но я подумал, что знание того, будет ли превышение скорости, было бы хорошим началом.
Ответ №1:
Похоже, вы ищете acts_as_audited.
Ответ №2:
Если данные логически принадлежат одной таблице, поместите их в одну таблицу. Не разделяйте данные преждевременно по вертикали или горизонтали, если у вас нет веской причины.
Комментарии:
1. Однако, следуя вашему предложению, уникальные ключи, как правило, излишне усложняются. Обычно лучше материализовать текущую строку в отдельной таблице.
2. Я бы согласился с Денисом и добавил, что таблицы, в которых хранится текущая и историческая информация, имеют разные предикаты (разные значения), что является красным флагом на теоретическом уровне. (Красный флаг, который должен предостеречь вас от объединения обеих таблиц в одну таблицу, то есть.) Для меня «разные предикаты» считаются очень веской причиной.
Ответ №3:
Если у вас есть история, было бы достаточно просто создать таблицу, подобную…
history_id | resource_id | history_event
1 | 1 | created
2 | 1 | updated with silly info
С включенным индексом resource_id
это будет достаточно быстро. 🙂
Комментарии:
1. Спасибо! Есть идеи, как создать новый resource_id в Rails при создании нового экземпляра ресурса? Я думал об использовании глобальной переменной, но я не думаю, что модель будет иметь к ней доступ. В любом случае я надеюсь на лучшее решение
2. Вашему ресурсу автоматически будет присвоен идентификатор, когда он будет сохранен в базе данных или когда вы используете
Resource.create
метод. 🙂3. Верно, но, насколько я понимаю, каждой строке будет присвоен новый идентификатор. Мне нужен идентификатор для каждого экземпляра ресурса, поэтому идентификатор должен иметь возможность повторяться каждый раз, когда происходит новое обновление.
4. Верно.
history_id
является первичным ключом и, следовательно, будет полностью уникальным каждый раз, когда вы получаете новую строку.resource_id
в данном случае это НЕ уникально. У вас была бы ваша собственнаяresource
таблица, и ее первичным ключом была быresource_id
, поэтому, когда вы вводите в нее, она получала бы новуюresource_id
при каждой вставке. Имеет ли это смысл?