3桌或1桌?

时间:2013-01-22 22:16:08

标签: mysql

CREATE TABLE IF NOT EXISTS `domains` (
`domains_id` bigint(15) NOT NULL AUTO_INCREMENT,
`domains_url` varchar(255) NOT NULL,
PRIMARY KEY (`domains_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `domains_actions` (
  `domains_actions_id` int(15) NOT NULL AUTO_INCREMENT,
  `domains_actions_selmgec` int(15) NOT NULL,
  `domains_id` int(15) NOT NULL,
  `domains_actions_member` int(15) NOT NULL,
  `domains_actions_date` date NOT NULL,
  `actions_id` int(2) NOT NULL
  `domains_actions_value` int(15) NOT NULL,
  PRIMARY KEY (`domains_actions_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `actions` (
  `actions_id` int(15) NOT NULL AUTO_INCREMENT,
  `actions_action` varchar(15) NOT NULL,
  PRIMARY KEY (`actions_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

因此,如果我已正确阅读,我需要一个针对所喜欢/新/社交的动作表,然后将其链接到domains_actions。

2 个答案:

答案 0 :(得分:3)

不确定您要对这些做些什么,但他们显然有重复数据。您应该使用type列合并到一个表中;也许使用ENUM

CREATE TABLE IF NOT EXISTS `domains` (
  `domains_id` int(15) NOT NULL AUTO_INCREMENT,
  `domains_selmgec` int(15) NOT NULL,
  `domains_domain` int(15) NOT NULL,
  `domains_member` int(15) NOT NULL,
  `domains_date` date NOT NULL,
  `domains_type` int(2) NOT NULL,
  `type` ENUM('likes', 'new', 'social'),
  PRIMARY KEY (`domains_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

更具关系性和规范化的架构看起来像:

CREATE TABLE IF NOT EXISTS `domain` (
  `id` int(15) NOT NULL AUTO_INCREMENT,
  `selmgec` int(15) NOT NULL,
  `domain` int(15) NOT NULL,
  `member` int(15) NOT NULL,
  `date` date NOT NULL,
  `type` int(2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `type` (
  `id` tinyint(1) NOT NULL AUTO_INCREMENT,
  `type` varchar(6) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `domainType` (
  `domain_id` int(15) NOT NULL,
  `type_id` tinyint(1) NOT NULL,
  PRIMARY KEY (`domain_id`, `type_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

此设计允许您拥有单个域并为其分配多种类型。您需要将引擎更改为InnoDb并创建外键约束以强制执行这些类型。

See the demo

答案 1 :(得分:1)

在不知道所有细节的情况下,我会创建一个表,然后创建一个引用另一个表的TypeId列:

CREATE TABLE IF NOT EXISTS `domains` (
  `domains_id` int(15) NOT NULL AUTO_INCREMENT,
  `domains_selmgec` int(15) NOT NULL,
  `domains_domain` int(15) NOT NULL,
  `domains_member` int(15) NOT NULL,
  `domains_date` date NOT NULL,
  `domains_type` int(2) NOT NULL,
  `type_id` int(2) NOT NULL,
  PRIMARY KEY (`domains_likes_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

CREATE TABLE IF NOT EXISTS `types` (
  `type_id` int(15) NOT NULL AUTO_INCREMENT,
  `type_name` varchar(15) NOT NULL,
  PRIMARY KEY (`type_id`)
) ;