Основной вопрос: как правильно переделать эту схему - PullRequest
0 голосов
/ 23 февраля 2011

Я прыгаю над проектом, который находится поверх БД Sql Server 2008 с тем, что мне кажется неэффективной схемой.Тем не менее, я не являюсь экспертом в любом вопросе SQL, поэтому я ищу руководство.

В общем, схема имеет такие таблицы:

ID |A |B

  • ID - это уникальный идентификатор
  • A содержит текст, например имена животных.Там очень мало разнообразия;может быть 3-4 разных значения в тысячах строк.Это может меняться со временем, но все же небольшой набор.
  • B - один из двух вариантов, но хранится в виде текста.Набор конечен.

Мои вопросы следующие:

  • Должен ли я создать еще одну таблицу для имен, содержащихся в A, с идентификатором и значением, и установитьID в качестве первичного ключа?Или мне просто поставить индекс на этот столбец в моей таблице?Прямо сейчас, чтобы получить список A, он «выбирает отдельный (a) из таблицы», что мне кажется неэффективным.
  • В таблице есть множество столбцов для свойств A. Это может выглядеть так:Цвет, возраст, вес и т. Д. Я думаю, что это лучше подходит для отдельной таблицы: ID, AnimalID, Свойство, Значение.Каждое свойство является уникальным для животного, поэтому я не уверен, как эта схема могла обеспечить это (текущая схема подразумевает это как столбец, поэтому вы можете иметь только одно значение для каждого свойства).

Прямо сейчас БД легко читается человеком, но ее размер быстро растет, и я чувствую, что дизайн неэффективен.Там в настоящее время нигде нет индекса.Как я уже сказал, я не профессионал, но буду читать больше на эту тему.Цель состоит в том, чтобы иметь быструю систему.Спасибо за ваш совет!

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

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

Если в таблице, которую вы описываете, представлены различные пациенты (животные), приходящие в клинику, то, вероятно, лучше всего иметь свойства, специфичные для них, на первичной таблице. Но, как вы говорите, столбец «А» содержит название вида, возможно, стоит связать его со вторичной таблицей, чтобы сэкономить на избыточности хранения этих названий:

Например:

Patients
--------
ID  Name   SpeciesID   Color         DOB         Weight
1   Spot   1           Black/White   2008-01-01  20

Species
-------
ID   Species
1    Cocker Spaniel

Если ваша основная таблица должна быть сгруппирована по клиенту или владельцу, то вы можете добавить таблицу Animals и связать ее:

Customers
---------
ID   Name
1    John Q. Sample

Animals
-------
ID   CustomerID   SpeciesID   Name    Color        DOB          Weight
1    1            1           Spot    Black/White  2008-01-01   20

...

Что касается исходного столбца B, рассмотрите возможность преобразования его в логическое значение (BIT), если вам нужно только сохранить два состояния. За исключением этого, рассмотрим CHAR для хранения фиксированного количества символов.

1 голос
/ 23 февраля 2011

Как и большинство вещей, это зависит.

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

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

В любом случае, обязательно добавьте несколько индексов.

...