2009-06-21 1 views
3

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

--------------------------------------------- 
| Name | FavoriteFood     | 
--------------------------------------------- 
| Alice | Pizza       | 
| Mark | Sushi       | 
| Jack | Pizza       | 
--------------------------------------------- 

было бы больше пространства эффективного, чтобы иметь дополнительную таблицу под названием «Струна», который хранит строки и изменить столбец FavoriteFood Ань индекс в таблице строк. В приведенном выше примере «Пицца» выглядит так, будто она хранится дважды, но с дополнительной таблицей она хранится только один раз. Конечно, предположим, что есть 1 000 000 строк и 1000 уникальных строк вместо трех строк и 2 уникальных строк.

Редактировать: Мы не знаем, что такое FavoriteFoods заранее: они предоставляются пользователем. Программный интерфейс к таблице строк будет что-то вроде ...

String GetString(int ID) { return String at with Row-ID == ID } 

int GetID(String s) { 
    if s exists, return row-id; 
    else { 
    Create new row; 
    return new row id; 
    } 
} 

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

ответ

3

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

Хорошо спроектированная база данных должна быть в 3NF (третья нормальная форма). Только денормализуйте, когда вы определили проблему производительности путем измерения.

+0

Предполагая, что нет никаких дополнительных данных, связанных с продуктами питания (например, информация о питании), тогда его дизайн уже находится в 3NF. Не каждый бит повторяющихся данных должен быть целым числом, чтобы иметь нормализованную базу данных. –

+2

@ Тайлер Мак-Хенри: Я не говорил, что это так, не так ли? Я делал вывод, что дизайн более важен, чем оптимизация проблемы производительности, которой у вас нет. –

+1

Я бы сказал, что лучшая причина, чтобы пойти с ненормированными данными в этом случае, будет просто потому, что она вводит данные пользователя. Поэтому заставить их найти уже введенную строку в 1000 строк, которые уже введены, будет сложно. В любом случае вы будете иметь 6 разных вариантов каждой вещи, потому что пользователи захотят быть оригинальными и говорят, что им нравится пицца пепперони или пицца с сыром или пицца с 6 видами мяса. Несмотря на то, что Pizza хватило бы, вы получите 6 разных видов пиццы, так что в нормализации его не так уж и много. – Kibbee

4

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

+0

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

2

Если у вас есть другая таблица для хранения строк, вам будет проще обновить описания, например, если вам нужно обновить все Pizzas до итальянской пиццы, тогда вы можете сделать это с обновлением одной строки, если u используйте отдельную таблицу. Другим преимуществом будет перевод, и вы можете использовать другую таблицу для хранения переводов строки на разных языках и выбрать ее на основе текущего языка.

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

1

Доводы за то, что отдельные "Струны" стол:

  • наверно, меньше пространства, если строки повторять очень часто
  • Вероятно, быстрее типичные запросы - из-за меньшего I \ O

Минусы:

  • Вы напишете более сложные запросы к достичь тех же Рез ult
  • Если коэффициент повторения довольно мал, вы получите более высокий запрос выполнения времени. Чтобы разрешить каждый идентификатор к строке (или обратно), сервер базы данных выполнит один поиск (операция поиска) для каждого идентификатора.Таким образом, вы получаете log (Strings.Count()) фактор ~ для каждого запроса.

Но на самом деле это действительно эффективно. Например. большинство полнотекстовых поисковых систем используют почти такой подход для хранения карт документов.

Смежные вопросы