Я нахожусь в процессе проектирования довольно сложной системы. Одна из наших основных задач - поддержка одноранговой репликации SQL Server. Идея заключается в поддержке нескольких географически разделенных узлов.
Второстепенной проблемой является использование современного ORM на среднем уровне. Нашим первым выбором всегда был Entity Framework, главным образом потому, что разработчики любят работать с ним. (Они любят поддержку LiNQ.)
Так вот в чем проблема:
Имея в виду одноранговую репликацию, я остановился на использовании uniqueidentifier со значением по умолчанию newsequentialid () для первичного ключа каждой таблицы. Похоже, это обеспечивает хороший баланс между предотвращением коллизий ключей и уменьшением фрагментации индекса.
Однако оказывается, что текущая версия Entity Framework имеет очень странное ограничение : если ключевой столбец сущности является уникальным идентификатором (GUID), его нельзя настроить на использование значения по умолчанию (newsequentialid). ()) предоставлено базой данных. Прикладной уровень должен сгенерировать GUID и заполнить значение ключа.
Итак, вот дебаты:
- отказаться от Entity Framework и использовать другой ORM:
- использовать NHibernate и отказаться от поддержки LiNQ
- использовать linq2sql и отказаться от будущей поддержки (не говоря уже о привязке к SQL Server на БД)
- отказаться от GUID и перейти с другой стратегией PK
- разработать метод генерации последовательных идентификаторов GUID (COMBs?) На прикладном уровне
Я склоняюсь к варианту 1 с linq2sql (мои разработчики действительно любят linq2 [stuff]) и 3. Это главным образом потому, что я несколько не знаю альтернативных ключевых стратегий, которые поддерживают схему репликации, на которую мы нацелены, при этом также сохраняя все нормально с точки зрения разработчика.
Любое понимание или мнение будет с благодарностью.