Нужна ли нормализация для этой таблицы с двумя столбцами? - PullRequest
0 голосов
/ 16 апреля 2009

У меня есть 2 столбца: "строка", "int"
Я установил оба в качестве первичных ключей для уникальной комбинации.

Будет ли поиск, основанный на строковом столбце, хуже, чем дальнейшая нормализация строкового столбца и вместо этого иметь 2 int-столбца?

Ответы [ 6 ]

6 голосов
/ 16 апреля 2009

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

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

И если у вас уже есть индекс по обоим столбцам и вы сравниваете их оба, вы получаете все преимущества индекса.

2 голосов
/ 16 апреля 2009

Если вам действительно нужно строковое значение, тогда ответ - нет.

Сравнение строки в БД обходится дешевле, чем сравнение int, а затем поиск строки из int.

Что касается дублирования строк, то чем больше у вас дублирования, тем меньше места потребуется для денормализации. Это все равно будет медленнее.

Если вам нужна производительность по сравнению с хранилищем, придерживайтесь строки int PK.

1 голос
/ 16 апреля 2009

Таблица уже нормализована.

Изменение строки в int не является дальнейшей нормализацией.

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

1 голос
/ 16 апреля 2009

На самом деле это звучит довольно просто для тестирования.

Вы можете настроить таблицу в обоих направлениях, сгенерировать 100 000 случайных строк, выполнить несколько запросов к обоим и посмотреть, что быстрее.

0 голосов
/ 16 апреля 2009

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

int, string

Затем база данных может использовать индекс для поиска int или комбинации int и string. Но он не может использовать его для поиска строки.

Если вы создаете два отдельных индекса:

index 1: int
index 2: string

Тогда база данных может эффективно искать int и / или строку.

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

0 голосов
/ 16 апреля 2009

Если вы используете Oracle, вы можете попробовать сделать эту таблицу организованной по индексу с COMPRESS 1.

Из документов Oracle :

Укажите COMPRESS, чтобы включить ключ сжатие, которое устраняет повторное появление столбца первичного ключа значения в индексных таблицах. использование целое число, чтобы указать длину префикса, количество столбцов префикса сжать.

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