Нужны ли порядковые номера?

Я работаю над приложением winform (.NET), которое включает заказы, счета-фактуры, заказы на обслуживание, билеты и т. Д.

Обязательно ли, чтобы эти объекты были последовательными при нумерации своих идентификаторов? ИМО нет. Возьмем, к примеру, заказ, он может быть действительным только после прохождения через бизнес-уровень, во время этого процесса мог быть создан, утвержден и сохранен другой заказ с номером 2, в то время как заказ, который был создан ранее с идентификатором 1, не прошел проверку.

Кажется, это открывает банку с червями относительно того, какой слой назначает порядковый номер, не так ли?

В настоящее время я использую непоследовательные числа с префиксом идентификатора объекта. Например, в заказе используется OR-123. Это хорошая идея?

Спасибо

Связанный:

Уникальные, но простые идентификаторы для всей базы данных в SQL Server


person Saif Khan    schedule 08.06.2009    source источник


Ответы (8)


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

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

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

Вот несколько ссылок на COMB ID:

http://jeffreypalermo.com/blog/use-guid-comb-in-your-database-if-you-need-guid-keys-but-don-t-want-to-take-a-big-performance-hit/

http://www.informit.com/articles/article.aspx?p=25862

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

person Cade Roux    schedule 08.06.2009
comment
не будет ли использование GUID () с объединениями в SQL Server ресурсоемким с большим количеством данных заказа? - person Saif Khan; 09.06.2009
comment
Да, они берут 16 байтов вместо 4. Однако в этих 16 байтах вы получаете глобальную уникальность. sqlblogcasts.com/blogs/ martinbell / archive / 2009/05/25 / Мы сделали специальный увеличивающийся GUID, где вы также могли получать дату и время ожидания (фактически, метку времени создания) - так что вы почти получили это бесплатно. - person Cade Roux; 09.06.2009
comment
Кейд поднимает хороший момент - вы можете использовать метод COMB вместо NewSequentialID () для встраивания метки даты / времени в свой GUID, что избавляет от необходимости в отдельном столбце (при условии, что вам не нужно часто запрашивать эти метаданные - -добывать это может быть больно). COMB также является полезным методом, если вы хотите, чтобы ваш бизнес-уровень назначал ключ, поскольку .NET не имеет встроенного эквивалента NewSequentialID (). - person richardtallent; 09.06.2009
comment
Да, позвольте мне найти несколько ссылок для создания COMB ID и добавить их к ответу. - person Cade Roux; 09.06.2009

Вам нужны только последовательные идентификаторы, если это допустимое бизнес-требование.

person jonnii    schedule 08.06.2009
comment
... или если кластеризованный индекс вашей таблицы базы данных находится в этом поле идентификатора и скорость вставки всегда оправдывает себя при вставке в конец таблицы. - person richardtallent; 09.06.2009
comment
Даже при использовании GUID ключи могут генерироваться последовательно или нет. Один подправляем в индексы, другой - не очень :-) - person ; 04.01.2011

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

Подход с использованием префиксов очень удобен для быстрого определения чисел, но вы можете просто добавить «OR-» перед слоями выше db.

person Marc Gravell    schedule 08.06.2009

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

person johnny    schedule 08.06.2009

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

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

person Fredrik Mörk    schedule 08.06.2009
comment
+1 Я не поддерживаю возможный выбор GUID, но этот ответ действительно указывает на то, что идентификатор счета-фактуры может быть отдельной (деловой) проблемой от деталей реализации. Например, тогда это просто вопрос того, что / где / как [это] раскрывается по мере необходимости. - person ; 04.01.2011

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

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

person Hallgrim    schedule 08.06.2009

Если рассматриваемое поле является вашим первичным ключом, последовательные числа вставляются быстрее, даже если вы пропустите от 1 до 3 и т. Д.

Но последовательные числа создают проблему безопасности: люди «угадывают» URL-адреса, случайно меняют номера или разглашают бизнес-данные (сколько у вас пользователей и т. Д.).

Один из вариантов - использовать GUID (тип uniqueidentifier). Говорить вслух или набирать текст не очень удобно для человека, но достаточно случайный и уникальный.

Если вы используете SQL Server 2005, новая функция SequentialID () будет возвращать последовательный GUID, который дает вам как необходимую уникальность, так и быструю вставку в вашу таблицу.

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

person richardtallent    schedule 08.06.2009
comment
не будет ли использование GUID () с объединениями в SQL Server ресурсоемким с большим количеством данных заказа? - person Saif Khan; 09.06.2009
comment
Тип uniqueidentifier - это 16-байтовое число, которое в 4 раза превышает размер суррогатного ключа на основе int. Но на практике значения распределяются, поэтому пропуски сравнений соединений невелики, а требования к дополнительному хранилищу незначительны. В качестве дополнительного преимущества типы uniqueidentifier могут быть сгенерированы независимо на любом физическом сервере, поэтому масштабирование до нескольких намного проще, чем с помощью целочисленного ключа, и масштабируется до более чем 4 миллиардов записей, которые предлагает 32-разрядное целое число. - person richardtallent; 09.06.2009

Вы должны спросить у своего делового представителя, действительно ли номера действительно должны быть последовательными, а не у нас.

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

person Community    schedule 08.06.2009