Должен ли я отслеживать увеличение AccountNumber в отдельной таблице? - PullRequest
2 голосов
/ 27 июня 2011

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

Я просто смотрю нанесколько тысяч аккаунтов, так что я не беспокоюсь об оптимизации.

Ответы [ 5 ]

4 голосов
/ 27 июня 2011

Вероятно, вам следует использовать IDENTITY, если вы используете MS SQL, или эквивалентный, если вы используете какую-то другую БД.

Это будет правильно отслеживать идентификаторы, даже когда два человека пытаются создать учетную запись одновременно.

1 голос
/ 27 июня 2011

Если вы используете Oracle, используйте последовательность. http://www.techonthenet.com/oracle/sequences.php
Для MSSQL используйте что-то вроде этого. http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx

0 голосов
/ 28 июня 2011

Боюсь, я не знаком с SQLlite. Но большинство SQL-движков в наши дни имеют своего рода функцию «автонумерации».

В противном случае создайте последовательность. Механизм БД должен управлять последовательностью за вас, чтобы вы никогда не получали дубликатов.

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

0 голосов
/ 27 июня 2011

Вопрос был изначально помечен .Net и C #, поэтому я предположил MSSQL, а это не так. Я не знаю, насколько этот ответ действителен при использовании с Sqlite.

Есть несколько стратегий, чтобы справиться с этим. Я думаю, что эти два наиболее интересны:

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

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

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

0 голосов
/ 27 июня 2011

Если вы используете SQL Server, вы можете использовать функцию Max, которая будет возвращать самое высокое значение строки, которую вы просматриваете.

Обновление: Простой пример.Select Max(AccountNumber) from Accounts

Обновление:Хорошо, возможно я был неправ, не используйте Макс, так как это вызовет некоторые проблемы.:( Извините.

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