Mysql动态表扩展列

时间:2012-02-08 16:49:26

标签: mysql database-design

我想知道是否有更好的方法来创建一些mysql表,而不是我在这个项目中使用的表。我有一系列代表特定时间的数字。例如,数字101将代表2012年1月12日。它不仅代表时间,而且是信息的基础。所以我创建了一个词典表,其中包含我们使用的所有数字以及详细信息,例如该数字的时间和含义。我有另一张桌子,每个顾客,无论何时购买,我都会检查购买是否符合特定时间的要求。但我检查每次购买和词典表的表格没有关联。我想知道是否有更好的方法,也许是一种方法来获取一个sql语句从Lexicon表中获取所有数据并将其转换为列,而行由客户ID和真/假选择器组成。

 table structure

 THIS IS THE CUSTOMER PURCHASED TABLE T/F
 CREATE TABLE `group1` (
`100` TINYINT(4) NULL DEFAULT '0',
`101` TINYINT(4) NULL DEFAULT '0',
`102` TINYINT(4) NULL DEFAULT '0',
... this goes on for 35 times each table
PRIMARY KEY (`CustID`)
 )


 THIS IS THE LEXICON TABLE
 CREATE TABLE `lexicon` (
`Number` INT(3) NOT NULL DEFAULT '0',
`Date` DATETIME NULL DEFAULT NULL,
`OtherPurtinantInfo` .... etc

 )

所以我猜想不是每个季节为客户制作一组数字,而是希望能够使用更新的词典表来自动生成表格。我唯一担心的是,我们有许多数字,这样可以将一个非常大的表组合在一起,但也许可以自动限制为组,这样它就不是一个压倒一切的表。

我不确定自己是否足够清楚,所以请随意评论需要澄清的事项。

1 个答案:

答案 0 :(得分:1)

这是一个标准化的ERD,基于我对您的业务要求的理解:

enter image description here

分类广告在某些日期运行,并且某个广告可以针对多个分类广告日期运行。

制作表格的SQL语句:

CREATE TABLE IF NOT EXISTS `classified_ads` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `classified_dates` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `date` DATETIME NOT NULL,
    `info` TEXT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `classified_ad_dates` (
    `classified_ad_id` INT UNSIGNED NOT NULL,
    `classifiend_date_id` INT UNSIGNED NOT NULL,
    PRIMARY KEY (`classified_ad_id`, `classifiend_date_id`),
    INDEX `fk_classified_ad_dates_classified_ads1` (`classified_ad_id` ASC),
    INDEX `fk_classified_ad_dates_classified_dates1` (`classifiend_date_id` ASC),
    CONSTRAINT `fk_classified_ad_dates_classified_ads1`
        FOREIGN KEY (`classified_ad_id`)
        REFERENCES `classified_ads` (`id`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT `fk_classified_ad_dates_classified_dates1`
        FOREIGN KEY (`classifiend_date_id`)
        REFERENCES `classified_dates` (`id`)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);