Оптимизация в MySQL

Discussion in 'PHP' started by ntldr, 29 Jan 2010.

  1. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    В общем пишу диплом значит, естественно на php+mysql :) . В общем это база данных, можно так сказать.
    Есть таблица клиентов, в ней содержится общая инфа о них, типа имени, паспортных данных, адреса, и.т.п. первичный ключ-id клиента.
    Вопрос в следующем. У каждого клиента есть около 50 параметров, причем каждый из этих параметров является не обязательным, также система предполагает добавление новых параметров и удаление существующих.
    Как лучше хранить дополнительные данные в mysql, я не думаю, что создавать таблицу из 50 полей это лучший вариант.

    p.s. другие СУБД не хотелось бы изучать. Нужен ответ именно насчет MySQL
     
  2. imajo.ati

    imajo.ati Banned

    Joined:
    21 Feb 2008
    Messages:
    232
    Likes Received:
    62
    Reputations:
    8
    PHP:
    CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

    USE `
    test`;

    CREATE TABLE IF NOT EXISTS `clients` (
    `
    id`       INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ид клиента',
    `
    name`     VARCHAR50 CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'имя клиента',
    `
    passwordVARCHAR40 CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'пароль клиента',
    UNIQUE (`name`)
    ENGINE MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 'клиенты';


    INSERT INTO `clients`
    (`
    id`, `name`, `password`)
    VALUES
    (NULL'Вася'SHA1('123456')),
    (
    NULL'Петя'SHA1('qwerty'));


    CREATE TABLE IF NOT EXISTS `conf_list` (
    `
    id`   SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ид настройки',
    `
    nameVARCHAR50 CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'имя настройки',
    UNIQUE (`name`)
    ENGINE MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 'список настроек';


    INSERT INTO `conf_list`
    (`
    id`, `name`)
    VALUES
    (NULL'passport'),
    (
    NULL'address');


    CREATE TABLE IF NOT EXISTS `clients_conf` (
    `
    id`        INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ид для операций с записями',
    `
    id_clientINT UNSIGNED NOT NULL COMMENT 'ид клиента',
    `
    id_conf`   INT UNSIGNED NOT NULL COMMENT 'ид настройки',
    `
    value`     VARCHAR500 CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'значение настройки'
    ENGINE MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 'соответствие настройка - клиент';


    INSERT INTO `test`.`clients_conf`
    (`
    id`, `id_client`, `id_conf`, `value`)
    VALUES
    (NULL'1''1''4004 213442'),
    (
    NULL'1''2''Ул. Ленина, дом 5, квартира стопицот '),
    (
    NULL'2''1''4003 934867'),
    (
    NULL'2''2''без опреледённого места жительства');
     
    1 person likes this.
  3. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Я думаю тебе стоит посмотреть в сторону EAV (Entity-attribute-value model).
    Не самая простая и оптимальная модель, но порою оправдывает себя :)
    Основной минус данной модели - уменьшение производительности засчет усложнения структуры (в общем приближении, не буду растекаться мыслью по древу).
    Но и плюсов море.
    Так же при кэшировании минус можно свести практически на нет. Все зависит от конкретной ситуации.
     
    1 person likes this.
  4. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    http://ru.wikipedia.org/wiki/Нормальная_форма
     
Loading...
Similar Threads - Оптимизация MySQL
  1. GAiN
    Replies:
    3
    Views:
    7,378