Помогите составить таблицу

Тема в разделе "Базы данных", создана пользователем goodvin, 4 авг 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    Есть 4 таблицы:

    CREATE TABLE `country` (
    `id_country` mediumint(8) unsigned NOT NULL auto_increment,
    `oid` int(10) unsigned NOT NULL,
    `core_country_name_ru` varchar(50) NOT NULL,
    `core_country_name_en` varchar(50) NOT NULL,
    `count_goods` int(128) NOT NULL,
    PRIMARY KEY (`id_country`)
    ) ENGINE=MyISAM AUTO_INCREMENT=219 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=219 ;

    CREATE TABLE `region` (
    `id_region` int(10) unsigned NOT NULL auto_increment,
    `id_country` mediumint(8) unsigned NOT NULL,
    `oid` int(10) unsigned NOT NULL,
    `core_region_name_ru` varchar(255) default NULL,
    `core_region_name_en` varchar(255) NOT NULL,
    `count_goods` int(128) NOT NULL,
    PRIMARY KEY (`id_region`),
    KEY `id_country` (`id_country`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1612 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1612 ;

    CREATE TABLE `city` (
    `id_city` int(10) unsigned NOT NULL auto_increment,
    `id_region` int(10) unsigned NOT NULL,
    `id_country` mediumint(8) unsigned NOT NULL,
    `oid` int(10) unsigned NOT NULL,
    `core_city_name_ru` varchar(255) default NULL,
    `core_city_name_en` varchar(255) NOT NULL,
    `count_goods` int(128) NOT NULL,
    PRIMARY KEY (`id_city`),
    KEY `id_region` (`id_region`),
    KEY `id_country` (`id_country`)
    ) ENGINE=MyISAM AUTO_INCREMENT=17590 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=17590 ;

    CREATE TABLE `categories` (
    `categories_id` bigint(20) NOT NULL default '0',
    `categories_left` bigint(20) NOT NULL default '0',
    `categories_right` bigint(20) NOT NULL default '0',
    `categories_level` int(11) default NULL,
    `categories_name` varchar(255) NOT NULL,
    `categories_url` varchar(128) default NULL,
    `categories_descriptions` varchar(500) default NULL,
    `categories_count` bigint(128) default NULL,
    PRIMARY KEY (`categories_id`),
    KEY `categories_count` (`categories_count`),
    KEY `categories_left` (`categories_left`),
    KEY `categories_right` (`categories_right`),
    KEY `categories_level` (`categories_level`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


    Теперь задача.

    Нужна еще одна таблица (возможно нужно больше 1 таблицы)
    ЗАдача таблицы собирать статистику сколько по каждому региону, по городу и по области есть товаров в каждом отдельном разделе. В свою очередь в разделах хранится общее количестов по данному разделу.
     
  2. McLay

    McLay Постоялец

    Регистр.:
    20 май 2008
    Сообщения:
    71
    Симпатии:
    15
    А где хрянятся связи categories_id->id_city ?
     
  3. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    в таблице city поле

    `id_country` mediumint(8) unsigned NOT NULL,

    лишнее, ибо в таблице регионов оно уже однозначно определено

    вот недостающая таблица:

    Код:
    CREATE TABLE `stat` (
    `categories_id` bigint(20) NOT NULL default '0',
    `id_city` bigint(20) NOT NULL default '0'
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
     
  4. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    Может я и не прав, ну куда там и как записывать счетчик товаров?
    Я думал чтото вроде

    CREATE TABLE `categories_count` (
    `categories` bigint(20) NOT NULL,
    `country` int(128) NOT NULL,
    `region` int(128) NOT NULL,
    `city` int(128) NOT NULL,
    `count` int(128) NOT NULL,
    KEY `country` (`country`),
    KEY `region` (`region`),
    KEY `city` (`city`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

    Токо возникает вопрос как заносить туда данные.
    Если строки нет и если строка с такой записью существует

    Добавлено через 13 минут
    Придумал вроде.

    CREATE TABLE `categories_count` (
    `hash` varchar(128) default NULL,
    `categories` int(128) NOT NULL,
    `country` int(128) NOT NULL,
    `region` int(128) NOT NULL,
    `city` int(128) NOT NULL,
    `count` int(128) NOT NULL,
    UNIQUE KEY `hash` (`hash`),
    KEY `country` (`country`),
    KEY `region` (`region`),
    KEY `city` (`city`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

    Добавил одно поле hash и сделал его уникальным.
    hash - это уникальные записи categories-country-region-city
    Потом юзаю такой запрос при добавлении или обновлении записи

    INSERT INTO `categories_count`
    (hash,categories,country,region,city,count) VALUES ('1-1-1-1',1,1,1,1,'')
    ON DUPLICATE KEY UPDATE count=count+1;

    Соответственно удаля запись просто меняем на -1
    ON DUPLICATE KEY UPDATE count=count-1;

    Попрошу гуру скула проверить, тк. записей с товарами будет очень много.
     
  5. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    Че молчек, глянте плиз.
    Ап темы.
     
  6. 452

    452 Создатель

    Регистр.:
    16 авг 2007
    Сообщения:
    31
    Симпатии:
    0
    еще Вы можете использовать тригеры для большей автоматизации счетчика)
    сеодня о них узнал,
    единственная проблема что не все хостинги дают доступ к ним...
    что делают тригеры..., это такая процедура которая выполняется только тогда когда изменяются или добавляются данные в таблицу.. отслеживают события добавления или удаения из таблицы...,
    как применить сдесь: создать тригер с реакцией на добавление новой записи в таблицу стран или городов..., если добавили тогда в таблице count счетчик инкрементировать количество стран например, php уже не затрагивает бд в єтом случае=)

    и кстати может выгоднее страны и города и все хранить в одной табличке)? с parentid
    id title parentid =)
     
  7. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    Читал и не понял, какой нужен счетчик. Если в последнем посте то что нужно, то можно твою таблицу без хеша написать:

    CREATE TABLE `categories_count` (
    `categories` int(128) NOT NULL,
    `country` int(128) NOT NULL,
    `region` int(128) NOT NULL,
    `city` int(128) NOT NULL,
    `count` int(128) NOT NULL,
    UNIQUE KEY `categories` (`categories`,`country`,`region`,`city`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
    Уникальность обеспечится индексом сразу по 4 полям.
    А дальше как и приводил INSERT INTO ... ON DUPLICATE KEY UPDATE...
     
    goodvin нравится это.
Статус темы:
Закрыта.