0

我对 CakePHP 很陌生,我想我已经很快掌握了它的要点。我的问题更多地与 MySQL 有关,但最后我会将 Cake 带回它。

我正在创建一个论坛/公告板类的应用程序。目前,我的数据库中有一个帖子条目,其中包含以下内容:id、title、body 等。

我的问题:我想实现各种不同类型的“帖子”。像照片帖子、文字帖子、员工帖子等(类似于 tumblr 组织帖子的方式)。我是否应该为这些帖子的每种类型制作单独的表格,例如 text_posts、photo_posts 等?或者,我是否可以在常规 Post 表中包含诸如“image_url”之类的字段,如果在创建时将其留空,那么我可以让视图将其解释为文本帖子?

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

4

3 回答 3

2

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

关系数据库不支持继承

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

1.单表继承(所有帖子一个表,那么会有很多NULL值。)

2.类表继承(尝试实现继承,但将您在 PHP 中创建的每个对象映射到表。)

3.Concrete Table Inheritance(每种帖子的单独表)

我不知道哪种解决方案更适合您。它们各有优缺点。

编辑:PHP部分

虽然我对 PHP 不太了解,但您可能可以这样做:

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

于 2013-03-10T00:00:58.090 回答
1

理论上,您可以为每个表创建一个不同的表并在其上编写一个视图。不幸的是,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
于 2013-03-10T06:19:54.170 回答
0

我认为 2 个表应该比为每种类型创建新表更好。

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

然后在帖子表中,使列尽可能通用,例如,您可以有一个“值”列,可用于根据帖子类型保存图像 url 或其他任何内容。

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

于 2013-03-11T14:23:43.647 回答