我应该如何设计我的MYSQL表?

时间:2010-05-30 21:42:00

标签: mysql database-design

我为一个使用一个'项目'表的架构师构建了一个非常基本的php / mysql站点。 该网站展示了他曾参与过的各种项目。

每个项目都包含一段文字和一系列图片。

原始项目表(创建语法):

CREATE TABLE `projects` (
  `project_id` int(11) NOT NULL auto_increment,
  `project_name` text,
  `project_text` text,
  `image_filenames` text,
  `image_folder` text,
  `project_pdf` text,
  PRIMARY KEY  (`project_id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

客户端现在需要以下内容,我不知道如何处理数据库中的扩展。 我怀疑我需要一张额外的桌子。

现在每个项目都有“页面”。

页面包含...

  • 一张图片
  • 一段“文字”
  • 一张图片和一段文字。

每个页面都可以使用三种布局中的一种。

由于每个项目目前没有超过4个文本(这是一个非常冒险的假设),我已经扩展了原始表以适应所有内容。

新项目表尝试(创建语法):

CREATE TABLE `projects` (
  `project_id` int(11) NOT NULL AUTO_INCREMENT,
  `project_name` text,
  `project_pdf` text,
  `project_image_folder` text,
  `project_img_filenames` text,
  `pages_with_text` text,
  `pages_without_img` text,
  `pages_layout_type` text,
  `pages_title` text,
  `page_text_a` text,
  `page_text_b` text,
  `page_text_c` text,
  `page_text_d` text,
  PRIMARY KEY (`project_id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

在尝试了解有关MYSQL表结构的更多信息时,我刚刚阅读了an intro to normalizationA Simple Guide to Five Normal Forms in Relational Database Theory。我要继续读! 提前致谢

1 个答案:

答案 0 :(得分:3)

标准化是你的朋友。

您需要转移到关系型双表设计。

CREATE TABLE projects (
   project_id int not null primary key auto_increment,
   project_name varchar(128),
   -- ...
);

CREATE TABLE pages (
   page_id int not null primary key auto_increment,
   project_id int not null, 
   pagetext text,
   image varchar(128), 
   -- ...
);

现在每个项目可以有任意数量的页面。

如果客户端然后返回并说“每个页面可以有0-N图像”,那么您需要第三个表,其中包含一个外键page_id(就像页面表有一个{{} 1}}外键)