долго по сравнению с Гуидом для идентификатора (Объект), каковы за и против

Я делаю веб-приложение на asp.net mvc, и я выбираю между долгим типом данных и типом данных Гуида для моих объектов, но я не знаю, какой лучше. Некоторые говорят, что долго намного быстрее. Гуид также мог бы иметь некоторые преимущества. Кто-либо знает?

13
задан Omu 9 February 2010 в 11:23
поделиться

3 ответа

Простой.

Подкласс BasicArrowButton и переопределить метод paint () и просто нарисовать изображение, упомянутое в вашем вопросе (ff.jpg или любое другое изображение), с помощью g.drawImage () .

Необходимо скопировать файл ff.jpg в проект и загрузить его.

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

-121--4817603-

Я полагаю, что причина того, что это невозможно, заключается в том, что количество 0 не означает, что объект не используется, потому что у вас может быть граф вызова, такой как

VB_Object
   |
   V
   |
Managed1 -<- Managed2

, и в этом случае Managed1 объекта все еще используется, даже если объект VB отбрасывает свою ссылку на него и поэтому его количество 0.

Если вам действительно нужно сделать то, что вы говорите, я думаю, вы могли бы создать классы обертки в неуправляемом C++, который вызывает метод Dispose, когда количество перерасчетов падает до 0. Эти классы, вероятно, могли бы быть codegen 'd из метаданных, но у меня нет никакого опыта в том, как реализовать такого рода вещи.

-121--1682711-

Когда GUID могут быть неподходящими

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

Также следует рассмотреть вопрос о целесообразности использования "длинного". Это огромное количество. Вам это нужно, только если вы думаете, что у вас может быть более 2 миллиардов записей в вашей таблице в какой-то момент. Редко я их использую.

GUID также могут быть трудными в использовании и отладке. Сказать, "есть проблема с записью клиента 10034, Фрэнк, иди проверь это" намного проще, чем сказать "есть проблема с {2f1e4fc0-81fd-11da-9156-00036a0f876a}"... Ints и longs также проще вводить в запросы, когда это необходимо.

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

Когда GUID могут быть соответствующими

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

GUID также позволяют связывать объекты без сохранения их в базе данных в определенных сценариях ORM. Linq к SQL (и я полагаю, что EF)у вас нет этой проблемы, хотя иногда вы вынуждены отправлять изменения в базу данных, чтобы получить ключ.

При создании GUID на клиенте возможно, что, поскольку создаваемые GUID не являются последовательными, производительность вставки может пострадать из-за разделения страниц в БД.

Мой совет

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

18
ответ дан 1 December 2019 в 22:07
поделиться

SIZE: Long - 8 байтов Guid - 16 байтов

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

long (Identity in DB), может представлять уникальную запись в таблице, но у вас могут быть записи, представленные одним и тем же идентификатором (Identity) в одной или нескольких разных таблицах, например:

TableA: PersonID int, name varchar(50)
TableB: ProductID int, name varchar(50)

SELECT PersonID from TableA where name =''
SELECT ProductID from TableB where name =''

оба могут возвращать одинаковое значение, но в случае GUID:

TableA: PersonID uniqueidentifier, name varchar(50)
TableB: ProductID uniqueidentifier, name varchar(50)

SELECT PersonID from TableA where name =''
SELECT ProductID from TableB where name ='

вы редко можете иметь такое же значение, как id, возвращаемое из двух таблиц

Посмотрите здесь

3
ответ дан 1 December 2019 в 22:07
поделиться

РАЗМЕР: Длина составляет 8 байт Guid равен 16 байтам

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

long (Identity in DB), может представлять уникальную запись в таблице, но записи могут быть представлены одним и тем же идентификатором (Identity) в одной или нескольких различных таблицах, например:

TableA: PersonID int, name varchar(50)
TableB: ProductID int, name varchar(50)

SELECT PersonID from TableA where name =''
SELECT ProductID from TableB where name =''

оба могут возвращать одно и то же значение, но в случае GUID:

TableA: PersonID uniqueidentifier, name varchar(50)
TableB: ProductID uniqueidentifier, name varchar(50)

SELECT PersonID from TableA where name =''
SELECT ProductID from TableB where name ='

Вы редко можете иметь такое же значение, как id, возвращенный из двух таблиц

Посмотрите здесь

-121--2685028-

Комментарий Codesleuth к другому ответу заставил меня снова прочитать вопрос и вот обновление.

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

[Flags]
enum MyTypes
{
    None = 0,
    One = 1,
    Two = 2,
    Three = 4,
    Four = 8,
    All = One | Two | Three | Four
}

Если пользователь может выбрать только один тип или все типы, используйте обычное перечисление:

enum MyType
{
    None,
    One,
    Two,
    Three,
    Four,
    All
}
-121--1930375-

Guids значительно упрощает создание «свежего» объекта в API, поскольку ему просто присваивается значение Guid.NewGuid (). Нет зависимости от автоматически приращенных ключей из базы данных, поэтому это лучше отделяет модель домена от базового механизма сохранения.

При использовании Guid в качестве кластеризованного индекса в SQL Server вставки становятся дорогостоящими, поскольку новые строки очень редко добавляются в конец таблицы, поэтому индекс необходимо перестраивать очень часто.

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

2
ответ дан 1 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: