MySQL Создать таблицу функций? - PullRequest
0 голосов
/ 28 августа 2011

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

У меня есть продукт, который продается по возрасту.Возраст определяет, существует ли этот продукт для этого человека, а минимальный и максимальный можно купить.Прямо сейчас я разработал таблицу следующим образом:

CREATE TABLE `tblProductsVsAge` (
   `id`                 int(255) AUTO_INCREMENT NOT NULL,
   `product_id`         bigint(255) NOT NULL,
   `age_min`            int(255) NOT NULL,
   `age_max`            int(255) NOT NULL,
   `quantity_min`       decimal(8) NOT NULL,
   `quantity_max`       decimal(8) NOT NULL,
   /* Keys */
   PRIMARY KEY (`id`)
) ENGINE = InnoDB;

это функционально и работает, но я чувствую, что это не самая лучшая оптимизированная структура.Любая идея?

я забыл упомянуть, что продукт может иметь много диапазонов.например, возраст минимум 25, возраст максимум 35, и количество для этого будет 12 и 28, для одного и того же идентификатора продукта у нас может быть возраст от 36 до 60, количество от 3 до 8.

Ответы [ 2 ]

0 голосов
/ 28 августа 2011
  • Используйте tinyint unsigned для age_max и age_min, так как ни один из возрастов в вопросе не проходит 255 (наибольший unsigned tinyint).
  • Используйте smallint unsigned для amount_max и amount_min, если эти значения> 255 и<= 65535 (максимальный размер без знака). </li>
  • Используйте mediumint unsigned для количества_макс. И количества_мин, если эти значения> 65535 и <= 16777215 (максимальный размер без знака). </li>
  • Используйте int unsigned для количества_макс.и amount_min, если эти значения> 16777215 и <= 4294967295 (самое высокое целое число без знака).(Иногда вам нужно мыслить масштабно !!!) </li>

Моя рекомендация:

CREATE TABLE `tblProductsVsAge` ( 
   `product_id`         int NOT NULL, 
   `age_min`            tinyint unsigned NOT NULL, 
   `age_max`            tinyint unsigned NOT NULL, 
   `quantity_min`       smallint unsigned NOT NULL, 
   `quantity_max`       smallint unsigned NOT NULL, 
   /* Keys */ 
   PRIMARY KEY (`product_id`, `age_min`) 
) ENGINE = InnoDB; 

Вот что нужно учитывать, если в таблице уже есть данные: Вы можете попросить mysql порекомендоватьопределения столбцов для этой таблицы.

Просто запустите этот запрос:

SELECT * FROM tblProductsVsAge PROCEDURE ANALYSE();

Директива PROCEDURE ANALYZE () приведет к тому, что mysql не будет отображатьсяданные, но изучить значения из каждого столбца и придумать свою собственную рекомендацию.Иногда рекомендация слишком гранулированная.Например, если age_min находится в подростковом диапазоне, он может порекомендовать ENUM ('13 ',' 14 ',' 15 ',' 16 ',' 17 ', 18', '19') вместо tinyint.После того, как PROCEDURE ANALYZE () завершен, вы по-прежнему выполняете последний вызов определений столбцов.

0 голосов
/ 28 августа 2011
CREATE TABLE `tblProductsVsAge` (
   `product_id`         int NOT NULL,
   `age_min`            smallint NOT NULL,
   `age_max`            smallint NOT NULL,
   `quantity_min`       smallint NOT NULL,
   `quantity_max`       smallint NOT NULL,
   /* Keys */
   PRIMARY KEY (`product_id`, `age_min`)
) ENGINE = InnoDB;

Изменения в вашей структуре:

  • id, вероятно, не требуется (если вам это действительно не нужно), но если вам нужно product_id, чтобы быть bigint, тогда id должен иметь тот же тип - после того, как вся эта таблица может получить больше строк, чем ваша таблица продуктов,
  • Я изменил тип od product_id на int, я не думаю, что у вас будет больше 2147483647продукты,
  • age и quantity, равны smallint с, которые могут иметь максимальное значение 32767 (используйте mediumint или int, если этого недостаточно).decimal предназначен для случаев, когда вам нужна точная точность или числа, превышающие bigint,
  • index для (id, age_min), для ускорения поиска по заданному product_id и для поиска, подобного product_id = {some_id} AND min_age > {user_age}

(255) в int / bigint определение не делает его длиной 255 цифр - это всего лишь подсказка для представления строки.

Руководство по MySQL для числовых типов: http://dev.mysql.com/doc/refman/5.5/en/numeric-types.html

...