Идентификаторы базы данных по умолчанию; системные и пользовательские значения

В рамках нашей текущей работы с базами данных мы рассматриваем процесс обновления баз данных.

Точка, которая неоднократно поднималась, связана с системными и пользовательскими ценностями; В нашем проекте пользовательские и системные значения хранятся вместе. Например...

У нас есть список шаблонов.

1, <system template>

2, <system template>

3, <system template>

Они отображаются в приложении для перечисления (1, 2, 3)

Затем приходит пользователь и добавляет ...

4, <user template>

...и...

5, <user template>

Затем .. мы выпускаем обновление .. и вставляем как часть наших сценариев обновления ...

<new id> [6], <new system template>

ПОТОМ !! ... мы находим ошибку в новом системном шаблоне и нуждаемся в ее обновлении ... Проблема в том, как? Мы не можем обновить запись, используя ID6 (поскольку мы могли вставить ее как 9 или 999, поэтому мы должны идентифицировать запись, используя какой-то другой механизм)

Итак, мы пришли к двум возможным решениям для этого.

В красном углу (скорость) ....

Мы просто начинаем идентификаторы пользователей с 5000 (или какое-то другое значение) и тестируем данные с 10000 (или какое-то другое значение). Это позволило бы нам вносить изменения в системные значения и проверять их до нижнего предела следующего диапазона идентификаторов.

Преимущество ... Быстрый и простой в реализации,

Недостаток ... может закончиться, если мы не выберем достаточно большой диапазон!

В синем углу (масштабируемость) ...

Мы храним, системные и пользовательские данные отдельно, используем идентификаторы GUID в качестве идентификаторов и объединяем два списка, используя представление.

Преимущество ... Масштабируемость. Нет ограничений по размеру БД.

Недостаток .. Сложнее в реализации. (многократные обновляемые представления и т. д.)


Я пухленький для первого варианта, но ищу боеприпасы, чтобы поддержать меня!

Есть ли у кого-нибудь какие-либо мысли по поводу этих подходов или хотя бы одного из них, которые мы пропустили?

13.08.2008 12:23:37
6 ОТВЕТОВ
РЕШЕНИЕ

У меня никогда не было проблем (производительности или разработки - включая TDD и модульное тестирование) с использованием GUID в качестве идентификатора для моих баз данных, и я работал над некоторыми довольно большими. Посмотрите здесь , здесь и здесь, если вы хотите узнать больше об использовании GUID (и потенциального задействованного GOTCHAS) в качестве ваших первичных ключей - но я не могу рекомендовать это достаточно высоко, так как перемещение данных безопасно и синхронизация БД становится настолько простой как чистить зубы по утрам :-)

На ваш вопрос выше я бы порекомендовал третий столбец (если это возможно), в котором указано, является ли шаблон пользовательским или системным, или вы можете по крайней мере генерировать GUID для системных шаблонов, вставляя их и сохраняя список те, что под рукой, так что если вам нужно обновить шаблон, вы можете просто указать тот же GUID в ваших базах DEV, UAT и / или PRODUCTION, не опасаясь перезаписи других шаблонов. Третий столбец пригодится для выбора всех системных или пользовательских шаблонов по желанию, без необходимости разделять их на две таблицы (это ИМХО излишне).

Надеюсь, это поможет,

Роб Г

1
13.08.2008 14:06:58

Может быть, я не понял, но разве вы не могли использовать идентификаторы GUID в качестве идентификаторов и при этом все еще хранить пользовательские и системные данные? Затем вы можете получить доступ к системным данным с помощью (неизменяемых) идентификаторов GUID.

0
13.08.2008 12:30:47

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

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

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

1
13.08.2008 12:36:21

Я не думаю, что GUID должен создавать какие-либо проблемы.

Если вы хотите избежать этого, используйте флаг:

ID int

шаблон независимо

флаг enum / int / bool

Флаг показывает, является ли фактическое значение системным или пользовательским значением.

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

0
13.08.2008 12:47:39

+1 для текстового идентификатора Бири - определите текстовый столбец "template_mnemonic" и сделайте его первичным ключом. Это будет известное значение, когда вы вставите его как вы, разработчики примут решение (или автоматически сгенерируют его), и вы всегда сможете ссылаться на шаблон по его мнемонике независимо от того, сколько шаблонов указано пользователем. Это также позволяет пользователям иметь осмысленное соглашение об именах для своих шаблонов.

1
13.08.2008 12:51:41

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

0
18.08.2008 14:08:13