0

私はCakePHPにまったく慣れていないので、その要点をかなり早く理解していると思います。私の質問はMySQLに関連するものですが、最後にCakeを元に戻します。

フォーラム/掲示板のようなアプリケーションを作成しています。現在、データベースに、id、title、bodyなどの通常の投稿エントリがあります。

私の問題:さまざまな種類の「投稿」を実装したい。写真の投稿、テキストの投稿、スタッフの投稿など(tumblrが投稿を整理する方法と同様)。text_posts、photo_postsなど、これらの投稿のタイプごとに個別のテーブルを作成する必要がありますか?または、「image_url」のような通常のPostテーブルに、作成時に空のままにした場合、ビューにテキスト投稿として解釈させるフィールドを含めることはできますか?

また、タイプごとに個別のテーブルを作成する場合は、掲示板のコントローラーにそれらの異なる投稿をすべて設定して、掲示板ビューに表示できるようにします。しかし、ビューでは、作成された時期に基づいて、1つの素敵なフィードにそれらをどのように表示させるのでしょうか。すべてのテキスト投稿、すべての写真投稿などを表示するforループは必要ありません。それらをメッシュ化する必要があります。

4

3 に答える 3

2

データベース構造の継承に問題があるように思われます。

リレーショナルデータベースは継承をサポートしていません

この問題を解決する方法を私が知っている3つの可能な方法は次のとおりです。

1.単一テーブル継承(すべての投稿に対して1つのテーブル、その場合は多くのNULL値があります。)

2.クラステーブル継承(とにかく継承を実装してみてください。ただし、PHPで作成する各オブジェクトをテーブルにマッピングします。)

3.Concrete Table Inheritance(投稿の種類ごとに個別のテーブル)

どの解決策があなたに適しているかはわかりません。それぞれに長所と短所があります。

編集:PHPの部分

PHPについてはよくわかりませんが、おそらく次のようなことができます。

投稿をデータベースに保存するためにオプション3を選択した場合でも、PHPで継承を導入することを選択できます。親クラスオブジェクト(Post)をループし、子に固有のプロパティ(Photo、Textなど)をそのオブジェクトタイプのインスタンスであるかどうかを確認して表示します。

于 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 などを保存するために使用できる「値」列を作成できます。

また、この段階で検討する価値があるのは、投稿に複数のタイプが必要かどうかです。その場合、ブリッジ テーブルが便利です。つまり、1 つのテーブルを別のタイプのポストに、3 番目のテーブルにポストとタイプ ID を外部キーとして保持します。

于 2013-03-11T14:23:43.647 に答える