2010-08-06 3 views
2

Я изучаю ASP.net и использую систему членства. Когда он автоматически генерировал таблицы, я был очень удивлен, увидев, что он использует тип поля, называемый «uniqueIdentifier», в качестве первичного ключа, когда на протяжении многих лет я использую целое поле, установленное как идентификатор, который автоматически увеличивается.Уникальный идентификатор SQL Server vs Integer

В чем разница (если есть вообще) между этими двумя методами и почему .NET, похоже, предпочитает уникальное поле идентификатора?

Спасибо за любую информацию!

Том

ответ

1

Я бы сказал, что .NET не благоприятствуют UniqueIdentifier или Guid как идентификатор, но это конкретная реализация (поставщик членства ASP.NET SQL Server) делает. Я подозреваю, что те, кто разработал базу данных, работали с предположением, что использование db не должно быть для сайтов с высоким трафиком или где может быть сделано большая отчетность.

Возможно, они пытались избежать каких-либо проблем с интеграцией в существующее приложение или в будущий сценарий, при котором у вашего приложения был ключ для пользователя. Это может быть любой ключ для любого объекта (PK, UserNumber и т. Д.). В реализации ASP.NET SQL Server вероятность столкновения очень низкая/приближается к нулю.

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

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

1

В чем разница (если вообще) между этими двумя методом

для одного UniqueIdentifier составляет 16 байт в то время как INT составляет 4 байта. Если у вас есть URL, как

http://bla.com?UserID=1

вы можете легко догадаться, что кто-то еще идент, так что вы можете попробовать 2 или 4 и т.д. и т.п.

, когда у вас есть это как UserID C7478034-BB60-4F5A-BE51-72AAE5A96640 это не так легко и также uniqueidentifiers должна быть уникальными accross всех компьютеры

, если они используют NEWID() вместо NEWSEQUENTIALID() тогда они получат осколочные и расщепления страниц, посмотри на Best Practice: Do not cluster on UniqueIdentifier when you use NewId

+0

Если программное обеспечение позволяет использовать эксплойты с помощью идентификаторов угадывания, тогда есть очевидный недостаток в программном обеспечении и использование более неясного идентификатора, чтобы предотвратить такую ​​атаку, на самом деле не справляется с проблемой, хотя это интересный момент, который у меня никогда не было хотя.Я думаю, что для страниц с закладками (например, страницы описания продукта) простой ID = x является намного более запоминающимся и «более приятным», чем большая строка. Я также редко сталкивался с индексами при использовании ints, но когда мне действительно легко преобразовать индекс в bigint. –

2

Тип uniqueidentifier - это тип типа SQL (соответствующий тип BCL - System.Guid). В концепции Guids представляют собой случайное 128-битное число, которое должно быть уникальным.

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

+0

Хорошая точка спасибо! –