2012-01-02 5 views
1

Ситуация, с которой я столкнулась, заключается в том, что я стараюсь работать наилучшим образом (с точки зрения использования памяти) для представления запасов запаса, хранящихся в разных магазинах в разные моменты времени. Настройка заключается в следующем:MySQL Оптимальное использование памяти поля

Таблица: Магазины

таблица, которая представляет собой список различных магазинов:

  • магазин Id (PK)
  • Название магазина
  • . .. другие детали

Вкладка ль: сток

  • Stock Id (PK)
  • Фото Имя
  • ...другие детали

Таблица: Магазин Сток Holdings

  • магазин Id
  • Stock Id
  • Дата
  • Количество

(магазин Id, Фото Id и дата выступать в качестве совместного первичного ключа с идентификатором магазина и Stoc к Id, как внешние ключи)

В качестве альтернативы я думал, что для хранения акций холдингов как JSon строки:

Таблица: Магазин Сток Holdings

  • магазин Id
  • Дата
  • складе Запасы

Так, например, пусть в хранилище 1 есть 50 лимонов (код = 1), 100 апельсинов (код = 2) и 20 манго (= 3) на 1 января 2011 года, тогда три установки будут представлять его как:

Вариант 1:

Store Id, Stock Id, Date, Quantity 

1 , 1, 2011-01-01, 50 
1 , 2, 2011-01-01, 100 
1 , 3, 2011-01-01, 20 

Вариант 2:

Store Id, Date, Stock Holdings 

1 , 1, 2011-01-01, \{1,50;2,100;3,20\} 

Вариант 3:

Было бы уменьшить репликацию хранения даты в варианте 1, разделив ее на две таблицы следующим образом:

Index, Store Id, Date 

1, 1, 2011-01-01 

Index, Stock Id, Stock Holdings 

1, 1, 50 
1, 2, 100 
1, 3, 20 

Так вопросы:

  1. Что бы моя скорость и хранение соображения для разных реализаций. Мое мышление - вариант 3, а вариант 2, скорее всего, лучший выбор, поскольку информация о дате не реплицируется.

  2. Для варианта 2 - память, хранящая строку JSON, распределенную динамически? Я имею в виду, что строка JSON может быть потенциально довольно большой и, как результат, ее нужно будет разрешить. Будет ли тогда новая запись охватывать общее распределение или только необходимый объем памяти на основе строки JSON? Я понимаю, что использование varchar будет динамически распределять память. Предлагаете ли вы использовать varchar?

+0

Для опции № 3, что такое поле «Индекс»? Если это суррогатный ключ (авто-номер), вы могли бы вместо этого использовать «Stock ID» (если я не пропустил что-то). – Aaron

ответ

1

MySQL - это система управления реляционными базами данных, поэтому она предназначена для работы с нормализованными реляционными данными.

Это означает, что он не может эффективно индексировать JSON строки: вы не будете в состоянии сказать, поиск по stockId эффективно работающих агрегатных запросов группировки штоком и т.д.

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

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

Что касается выбора между опцией 1 и опцией 3, последний просто заменяет естественный составной ключ (storeId, date) с суррогатной один (index).

Целое число короче по сравнению с INT + DATE комбинацией, поэтому могут быть случаи с краями, когда эта опция лучше (особенно если у вас есть несколько дат с действительно большим количеством записей на каждую дату, и вам не нужно запрашивать все магазины или все даты с учетом запаса). Тем не менее, хранение всего в одной таблице позволяет создавать составные индексы в любой комбинации storeId, stockId и date, которые могут иметь решающее значение для производительности.

Чтобы помочь вам сделать выбор между этими двумя, мы должны знать, какие запросы вы будете работать, но option 1storeId, stockId и date в одной таблице) будет определенно модель Choise.

+0

Извините за отложенный комментарий. Большое спасибо, это было полезно. – xyzjace

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