2015-06-22 2 views
0

Я вижу add_index ~ unique: true заявления в schema.rb и думать единственность ограничение для таблицы, а не для индекса индекса .Using является одним способом, реализующей уникальности, программист не должен назначить к РСУБДУ «как» и индекс животворите поиском, но взять расходы вставка. На самом деле, есть ли другой способ сохранить ограничение единственности? Если нет, то почему Rails предоставляют нам только add_index оператор для ограничения уникальности?Может ли Rails обрабатывать уникальность DB без индекса?

+0

'add_index ~ unique: true' он просто говорит добавить индекс в столбце, и индекс должен быть уникальным для этого столбца. Поскольку мы не хотим дублировать записи индекса. –

+0

http://stackoverflow.com/questions/14622143/adding-unique-true-for-add-column-and-add-index-in-active-record –

+0

в модели вы можете просто попробовать 'validates: field_name, уникальность: true' http://guides.rubyonrails.org/active_record_validations.html#uniqueness –

ответ

1

Потому что нет необходимости в других способах. Под капотом все равно: когда вы определяете ограничение UNIQUE, в этой таблице создается индекс UNIQUE, чтобы обеспечить его соблюдение.

  • Вопрос от DBA.SE: When should I use a unique constraint instead of a unique index?

    Так что для базы данных, которая поддерживает как показывает выбор для использования часто дошедших до предпочтительного стиля и консистенции.

    Так что использование индексов везде в Rails согласовано. Вот в чем причина.

  • процитировать из PostgreSQL's docs:

    PostgreSQL автоматически создает уникальный индекс, когда ограничение уникальности или первичный ключ определен для таблицы. Индекс охватывает столбцы, которые составляют первичный ключ или уникальное ограничение (если это необходимо, многоколоночный индекс) и является механизмом, обеспечивающим ограничение.

Я не нашел соответствующий процитировать для MySQL в качестве авторитетного источника, но «слухи везде».

+0

спасибо, я хочу знать, является ли добавление уникального индекса ** только одним ** способом ограничить уникальность, и факт в соответствии с вашим ответом. Однако этот синтаксис для пользователя, который знает реализацию уникальности в БД, я думаю, что это не хорошо ... (может быть, здравый смысл) – lastcat

+0

@lastcat предположение, что «вы можете ограничить столбец таблицы уникальным» происходит от прежнего опыта с РСУБД, а не здравый смысл. Rails использует эту возможность вдали от тех, кто ее знает, однако она четко документирует предпочтительный способ выполнения своих действий. –

1

Единственный безопасный способ гарантировать ограничение уникальности - обеспечить его соблюдение на уровне базы данных. Нет ничего плохого в этом, на самом деле, это правильный правильный путь. Любой разработчик или администратор базы данных подтвердит это вам.

Rails предоставляет валидатор уникальности, но он не полностью безопасен. Фактически, он основан на простом запросе к вашей базе данных, но выполняется небольшой промежуток времени между выполнением выбора и вставкой, что делает возможным (и, вероятно, в высококонкурентных системах или если ваша вставка занимает разумную сумму времени), чтобы создать дублируемую запись из-за этого состояния гонки.

Таким образом, единственный способ гарантировать уникальность - иметь уникальный индекс в базе данных. Если вас это беспокоит, вы можете захотеть прочитать какую-нибудь книгу или ресурс для проектирования баз данных, чтобы переоценить проблему с другой точки зрения.

Причина, по которой вы все еще хотите иметь валидацию в своей модели, заключается в том, что база данных (как правило) не прилагает никаких усилий для решения конфликта в удобном для пользователя способом. Валидация в вашей модели будет предварительно проверять данные и предотвращать создание исключений СУБД. Вы можете проверить результат проверки и показать дружеское сообщение пользователю.

Тем не менее, ограничение базы данных будет там, и в случае, если ваша проверка будет проходить из-за упомянутого выше состояния гонки, ваша целостность данных будет обеспечиваться СУБД, которая вызовет исключение.

Смежные вопросы