Выполняется ли поиск конкретной таблицы быстрее, чем поиск конкретной записи в конкретной таблице?

#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 при каждой вставке. Имеет ли это смысл?