Mysql Constraign базы данных в Rails - PullRequest
0 голосов
/ 23 декабря 2009

Я использую Mysql 5 и Ruby On Rails 2.3.1. У меня есть некоторые проверки, которые иногда не позволяют сохранить дубликаты в моей базе данных. Возможно ли на уровне базы данных ограничить создание дублирующейся записи на основе определенных параметров?

Я сохраняю электронные письма в базе данных и не хочу сохранять дублирующую строку темы, тело и адрес отправителя. Кто-нибудь знает, как наложить такой лимит на БД через миграцию?

Ответы [ 2 ]

1 голос
/ 23 декабря 2009

У вас есть несколько вариантов, чтобы гарантировать, что уникальный набор значений будет вставлен в вашу таблицу. Давайте рассмотрим 1) передачу ответственности ядру базы данных или 2) ответственность вашего приложения.

Возложение ответственности на ядро ​​базы данных может повлечь за собой использование уникального индекса для вашей таблицы. См. Синтаксис MySql Create Index . Обратите внимание, что это решение может привести к возникновению исключения в случае вставки дублирующего значения. Поскольку вы определили, что я определяю как три столбца для определения уникальности (строка темы, тело и адрес отправителя), вы создадите индекс, включающий все три столбца. Прошло много времени с тех пор, как я работал с Rails, поэтому вы можете проверить количество вставленных записей.

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

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

0 голосов
/ 23 декабря 2009

Вы должны иметь возможность добавить уникальный индекс к любым столбцам, которые вы хотите быть уникальными по всей таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...