Генерация уникальных идентификаторов базы данных в коде - PullRequest
2 голосов
/ 07 августа 2009

Одно требование состоит в том, что при сохранении моих объектов C # в базе данных я должен определить идентификатор базы данных (суррогатный первичный ключ) в коде.

Вторым требованием является то, что тип базы данных для ключа должен быть int или char (x) ... поэтому не нужно иметь уникальный идентификатор или двоичный код (16) или тому подобное.

Это неизменные требования.

Как лучше всего справиться с этим?

Одной из идей является GUID в кодировке base64, который выглядит как "XSiZtdXcKU68QWe7N96Dig". Они легко создаются в коде и, если необходимо, приемлемы для URL. Но будет ли это слишком дорого с точки зрения производительности (индексации, размера), когда все первичные и внешние ключи будут char (22)? Мне очень нравится эта идея.

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

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

Ответы [ 4 ]

1 голос
/ 07 августа 2009

Вы можете иметь таблицу под названием «последовательности». Для каждой таблицы будет строка со счетчиком. Затем, когда вам понадобится другой номер, извлеките его из таблицы счетчиков и увеличьте его. Поместите это в сделку, и вы получите уникальность.

Однако это, конечно, будет сказываться на производительности.

0 голосов
/ 14 марта 2012

Для таблицы ниже 1.000.000 строк, я не был бы слишком обеспокоен первичным ключом char (22). Конечно, идеальным решением для подобной ситуации было бы, чтобы у каждого объекта было что-то уникальное, что вы могли бы использовать для ключа, даже если это ключ из нескольких частей. Следующим идеальным решением будет изменение требований:)

0 голосов
/ 07 августа 2009

Видя, что у вас есть приложение ASP.NET, вы можете сделать следующее (надеясь и предполагая, что все пользователи должны подтвердить свою подлинность перед использованием вашего приложения!):

  • Назначьте каждому пользователю уникальный «UserID» в вашей базе данных (может быть INT или CHAR)
  • Назначьте каждому пользователю «HighestSequentialID» (INT) в вашей базе данных
  • Когда пользователь входит в систему, считайте эти значения из базы данных и сохраните их, например, в. пользовательский принципал, или в куки, или что-то еще
  • всякий раз, когда пользователь собирается вставить строку, создайте сегментированный идентификатор: (UserID). (Порядковый номер пользователя) и сохраните его как «VARCHAR (20)» - например, Ваш UserID равен 15, и поэтому записи этого пользователя будут иметь уникальные идентификаторы "15.00001", "15.00002" и так далее.
  • когда пользователь выходит из системы (или в любое другое время), обновляет свой новый, наиболее часто используемый последовательный идентификатор в базе данных, чтобы в следующий раз вы знали, что этот пользователь использовал в последний раз

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

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

Марк

0 голосов
/ 07 августа 2009

Простое увеличение int будет самым простым способом обеспечения уникальности. Это то, что будет делать база данных, если вы позволите. Если для строки таблицы задано значение auto_increment, база данных сделает это автоматически.

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

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