Я вижу add_index ~ unique: true
заявления в schema.rb
и думать единственность ограничение для таблицы, а не для индекса индекса .Using является одним способом, реализующей уникальности, программист не должен назначить к РСУБДУ «как» и индекс животворите поиском, но взять расходы вставка. На самом деле, есть ли другой способ сохранить ограничение единственности? Если нет, то почему Rails предоставляют нам только add_index
оператор для ограничения уникальности?Может ли Rails обрабатывать уникальность DB без индекса?
ответ
Потому что нет необходимости в других способах. Под капотом все равно: когда вы определяете ограничение UNIQUE
, в этой таблице создается индекс UNIQUE
, чтобы обеспечить его соблюдение.
Вопрос от DBA.SE: When should I use a unique constraint instead of a unique index?
Так что для базы данных, которая поддерживает как показывает выбор для использования часто дошедших до предпочтительного стиля и консистенции.
Так что использование индексов везде в Rails согласовано. Вот в чем причина.
процитировать из PostgreSQL's docs:
PostgreSQL автоматически создает уникальный индекс, когда ограничение уникальности или первичный ключ определен для таблицы. Индекс охватывает столбцы, которые составляют первичный ключ или уникальное ограничение (если это необходимо, многоколоночный индекс) и является механизмом, обеспечивающим ограничение.
Я не нашел соответствующий процитировать для MySQL в качестве авторитетного источника, но «слухи везде».
спасибо, я хочу знать, является ли добавление уникального индекса ** только одним ** способом ограничить уникальность, и факт в соответствии с вашим ответом. Однако этот синтаксис для пользователя, который знает реализацию уникальности в БД, я думаю, что это не хорошо ... (может быть, здравый смысл) – lastcat
@lastcat предположение, что «вы можете ограничить столбец таблицы уникальным» происходит от прежнего опыта с РСУБД, а не здравый смысл. Rails использует эту возможность вдали от тех, кто ее знает, однако она четко документирует предпочтительный способ выполнения своих действий. –
Единственный безопасный способ гарантировать ограничение уникальности - обеспечить его соблюдение на уровне базы данных. Нет ничего плохого в этом, на самом деле, это правильный правильный путь. Любой разработчик или администратор базы данных подтвердит это вам.
Rails предоставляет валидатор уникальности, но он не полностью безопасен. Фактически, он основан на простом запросе к вашей базе данных, но выполняется небольшой промежуток времени между выполнением выбора и вставкой, что делает возможным (и, вероятно, в высококонкурентных системах или если ваша вставка занимает разумную сумму времени), чтобы создать дублируемую запись из-за этого состояния гонки.
Таким образом, единственный способ гарантировать уникальность - иметь уникальный индекс в базе данных. Если вас это беспокоит, вы можете захотеть прочитать какую-нибудь книгу или ресурс для проектирования баз данных, чтобы переоценить проблему с другой точки зрения.
Причина, по которой вы все еще хотите иметь валидацию в своей модели, заключается в том, что база данных (как правило) не прилагает никаких усилий для решения конфликта в удобном для пользователя способом. Валидация в вашей модели будет предварительно проверять данные и предотвращать создание исключений СУБД. Вы можете проверить результат проверки и показать дружеское сообщение пользователю.
Тем не менее, ограничение базы данных будет там, и в случае, если ваша проверка будет проходить из-за упомянутого выше состояния гонки, ваша целостность данных будет обеспечиваться СУБД, которая вызовет исключение.
- 1. частичная уникальность индекса
- 2. Может ли скрепка обрабатывать файлы без изображения?
- 3. Удалить уникальность индекса в PostgreSQL
- 4. Может ли uwsgi обрабатывать запрос без HTTP?
- 5. Может ли составной индекс MongoDB иметь уникальность в подмножестве полей?
- 6. Приложение Rails не может обрабатывать несколько пользователей
- 7. Чувствительный уникальность и поиск без учета регистра
- 8. Rails проверяет уникальность с повторениями
- 9. Rails уникальность нескольких (агрегированных) столбцов?
- 10. Rails проверяет уникальность диапазонов дат
- 11. реализация файла индекса db
- 12. Рекомендация индекса SQL Db
- 13. Как оценить уникальность таблицы без первичного ключа
- 14. Сколько одновременных выгрузок может обрабатывать десктоп Rails
- 15. Rails 4 Уникальность столбца модели не работает
- 16. Проверка цифровой уникальность двух атрибутов в Rails
- 17. Rails HABTM: уникальность Post.title только для пользователя
- 18. Может ли SQLite обрабатывать 90 миллионов записей?
- 19. Выбор нужного индекса db
- 20. Может ли XStream обрабатывать сложные объекты без дополнительной работы?
- 21. Может ли функция обрабатывать несколько пользовательских объектов без использования конвейера?
- 22. Определение того, может ли принтер обрабатывать задание без поиска
- 23. Может ли TDD обрабатывать комплексные проекты без предварительного дизайна?
- 24. Может ли Gradle обрабатывать устаревшие проекты без необходимости реструктурировать каталоги?
- 25. Может ли Rust обрабатывать циклические структуры данных без сбора мусора?
- 26. Может ли пуля обрабатывать жидкости?
- 27. Может ли RewriteRule обрабатывать оператор `-`?
- 28. Может ли диск обрабатывать RPC?
- 29. Может ли strtotime обрабатывать фракции?
- 30. Может ли Java обрабатывать Expando?
'add_index ~ unique: true' он просто говорит добавить индекс в столбце, и индекс должен быть уникальным для этого столбца. Поскольку мы не хотим дублировать записи индекса. –
http://stackoverflow.com/questions/14622143/adding-unique-true-for-add-column-and-add-index-in-active-record –
в модели вы можете просто попробовать 'validates: field_name, уникальность: true' http://guides.rubyonrails.org/active_record_validations.html#uniqueness –