CakePHP: post类型的表组织


CakePHP: Table Organization for types of Posts

我是CakePHP的新手,我想我已经相当快地掌握了它的要点。我的问题更多是关于MySQL的,但最后我会把Cake带回来。

我正在创建一个论坛/公告板类型的应用程序。目前,我在我的数据库中有一个帖子条目,其中包含常用的:id,标题,正文等。

我的问题:我想实现各种不同类型的"帖子"。像照片帖子,文字帖子,员工帖子等(类似于tumblr如何组织其帖子)。我是否应该为每种类型的这些帖子,如text_posts, photo_posts等单独的表?或者我可以在常规Post表字段像"image_url",如果它在创建时留下空,那么我有视图解释它作为一个文本帖子?

如果我要为每种不同类型创建单独的表,我将在公告板控制器中设置所有这些不同的帖子,以便我可以在公告视图中显示它们。但在视图中,如何让它们根据创建时间显示在一个提要中?我不想让for循环显示所有文本帖子,所有照片帖子等。我想让它们啮合在一起。

在我看来,您的数据库结构中存在继承问题。

关系数据库不支持继承

我知道如何解决这个问题的三种可能的方法是:

1。单表继承(一个表所有的帖子,将有很多NULL值。)

2.Class表继承(尝试实现继承,但映射每个对象,你将在PHP创建一个表)

3。具体表继承(每种类型的帖子单独的表)

我不知道哪种解决方案对你更好。它们各有优缺点。

编辑:PHP部分

虽然我对PHP了解不多,但你可以这样做:

如果您选择选项3将帖子存储在数据库中,您仍然可以选择在PHP中引入继承。循环遍历父类对象(Post),并通过检查它是否是该对象类型的实例来显示特定于子类(Photo, Text等)的属性。

理论上,您可以为每个表创建一个不同的表并在其上编写一个视图。不幸的是,MySQL不支持您需要插入的代替触发器。下面是一个使用sqlite3的例子。

create table PhotoTable (
id     integer not null PRIMARY KEY AUTOINCREMENT,
PhotoName varchar(255),
Camera    varchar(255)
);

create table StaffTable (
  id integer not null PRIMARY KEY AUTOINCREMENT,
  StaffName varchar(255)
); 
--- Odd way of seeding AUTOINCREMENT value in SQLite3
insert into StaffTable(StaffName) values('odd');
delete from StaffTable;
update SQLITE_SEQUENCE set seq = 100000 where name ='StaffTable';

create view posts as
select id, 'Photo' as Type, PhotoName, Camera, NULL as StaffName from PhotoTable
union all 
select id, 'Staff' as Type, NULL as PhotoName, NULL as Camera,StaffName from StaffTable;

create trigger postsinsert
instead of insert on posts
for each row
begin
    insert into PhotoTable(PhotoName, Camera) select new.PhotoName, new.Camera where New.Type ='Photo';
    insert into StaffTable(StaffName) select new.StaffName where New.Type = 'Staff';
end;

insert into posts(Type, PhotoName, Camera) values('Photo','photo1','nk');
insert into posts(Type, PhotoName, Camera) values('Photo','photo2','canon');
insert into posts(Type, StaffName) values('Staff', 'spaceghost');

得到预期结果

 select * from posts;
1|Photo|photo1|nk|
2|Photo|photo2|canon|
100001|Staff|||spaceghost

我认为两个表应该比为每种类型创建一个新表要好。

你可以有posts表和post_types表,在posts表中你可以有post_type_id外键,这将帮助你增加类型而不必每次创建一个新表

然后在posts表中,使列尽可能通用,因此,例如,您可以有一个"值"列,您可以用于保存图像url或基于帖子类型的任何其他内容。

在此阶段还值得考虑的是,如果您的帖子需要多个类型,在这种情况下,桥接表将是方便的,因此一个表用于帖子,另一个表用于类型,第三个表用于保存帖子和类型id作为外键。