我为一个使用一个'项目'表的架构师构建了一个非常基本的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 normalization和A Simple Guide to Five Normal Forms in Relational Database Theory。我要继续读! 提前致谢
答案 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}}外键)