一个CMS建站系统,里面涉及的主要的PO分别有新闻(News)、产品(Product)、电影(Movie)、分类信息(infos)、图片集(Album)。
而在后台分别为四个表单,但这它们的属性都存在很多共有的东西。
比如说无论是新闻、产品、电影、图片集、还是供求信息(分类信息中的一种),都会有title,keywords,description,body,以及作者author和发布时间等等。当然它们里面也有很多不同之处。如果把它们的相同之处提取出来做一个po名为文档(Article),让这五个PO 都继承(extends) Article.
表结构:
Article对应的表
CREATE TABLE `bl_article` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(255) default '',
`contents` mediumtext,
`click` int(11) default '1',
`tag` varchar(255) default '',
`keywords` varchar(255) default '',
`info` varchar(500) default '',
`logtime` datetime default NULL,
..略
`admin_id` int(11) default NULL,
PRIMARY KEY (`id`),
KEY `FKCF6F4D1E70184653` (`admin_id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Album.java对应的表
CREATE TABLE `bl_article_album` (
`article_id` int(11) NOT NULL,
`pagestyle` int(11) default NULL,
`row` int(11) default NULL,
略
`album_id` int(11) default NULL,
PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='InnoDB free: 9216 kB';
News.java对应的表
CREATE TABLE `bl_article_news` (
`article_id` int(11) NOT NULL,
`page` bit(1) default NULL,
`pageSize` int(11) default NULL,
`shortTitle` varchar(125) default '',
`catalog_id2` int(11) default '0',
略
PRIMARY KEY (`article_id`),
KEY `FK1BB87954B86DF255` (`article_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Product.java对应的表
CREATE TABLE `bl_article_product` (
`article_id` int(11) NOT NULL,
`pname` varchar(50) default NULL,
`pimg` varchar(255) default NULL,
略
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
略写其他表
优点:这样的继承方式让程序很方便统一的去处理各个表单。从文档的栏目,也就是分类(Catalog)、评论(Comment)可以直接和Article对一对多关系,而不必一一和它下面的子类去做一对多关联。而从验证、到持久化、再到静态化,程序都可以一个流程都下来了。
缺点:但从数据库的角度考虑,这种设计方式,随着数据量的增加,无论是添加哪类表单,Article中可以都会增加一条记录。接着再会存一条记录到相应分类的表中去。如果是一个综合大中门户型网站来使用,无论它在后台提交交友信息、新闻信息、动画信息一系列表单,最后肯定不可避免的存入Article表中一部分数据,而这样的表结构是否适合呢?