Существует ли метод SQL Server 2008 для группировки строк в таблице так, чтобы они вели себя как вложенная таблица? - PullRequest
1 голос
/ 19 ноября 2009

Это может оказаться самым глупым вопросом в истории.

Я хочу отслеживать группы и членов групп через SQL.

Допустим, у меня есть 3 группы и 6 человек.

Я мог бы иметь таблицу, такую ​​как:

alt text

Тогда, если бы я хотел найти, какие personID находятся в groupID 1, я бы просто сделал

select * from Table where GroupID=1

(Все это знают)

Моя проблема в том, что у меня есть миллионы строк, добавленных в эту таблицу, и я хотел бы сделать некоторую предварительную сортировку по GroupID, чтобы сделать поиск максимально быстрым. Я имею в виду сценарий, где он будет иметь вложенные таблицы, где каждая вложенная таблица будет содержать членов groupID. (Показано ниже)

alt text

Таким образом, когда я хотел выбрать каждый элемент GroupMembers, структура в SQL уже была бы вложенной, а не такой дорогой, как при просмотре строк.

Существует ли такая структура, по сути, таблица, которая бы вращалась вокруг groupID? Является ли индексирование таблицы о groupID лучшим / единственным вариантом?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2009

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

  • Должна ли таблица кластеризоваться (PersonID) с некластеризованным индексом (GroupId))?
  • Должен ли это быть кластеризованный индекс на (GroupId, PersonID) с некластеризованным индексом на (PersonId)?
  • Или он должен быть кластеризован (PersonId, GroupId) с некластеризованным индексом (GroupId, PersonId)?

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

Подход к этой проблеме с точки зрения того, что дает вам EF или другой уровень ORM, может привести к плохому дизайну базы данных. В конечном счете, все ваше приложение, столь же причудливое и тщательно закодированное, как оно есть, является ничем иным, как тонкой оболочкой вокруг базы данных. Подумайте о том, чтобы подойти к этому с точки зрения моделирования звуковых данных, создайте хороший дизайн схемы таблицы, а затем напишите свой код поверх него, а не наоборот. Я понимаю, что это идет вразрез со всем, что сегодня рекомендуют проповедники на улице, но я видел слишком много приложений, разработанных в Visual Studio, при сбое развертывания различных редакторов контекстов данных ...

1 голос
/ 19 ноября 2009

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

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