2

次のPHPクラスを反映するMySQLデータベースを作成します。

  • コンテンツ
  • 記事はコンテンツを拡張します
  • 投稿はコンテンツを拡張します
  • ..。

コメント、無視など、コンテンツに関連付けられたモデルがあります。

ここでの問題は、どのデータモデルを使用するかです。

1)モデルごとに1つのテーブル

2)1つの大きなコンテンツテーブル(すべてのクラスプロパティが列として)と、他のモデル用の単一のテーブル。それは単一テーブル継承と呼ばれていると思います。

3)共通のフィールド、または一般的に検索するフィールド(インデックス)のみを含む大きなコンテンツテーブルと、残りのプロパティを含む大きなコンテンツデータテーブル。

4)別の方法?

コンテンツに対してクエリを実行し、コンテンツタイプ(サブクラス)に関係なく、最近のロケーションベースのコンテンツまたは何らかの方法でフィルタリングされたコンテンツを取得できるようにする必要があります。したがって、解決策1はおそらく問題外です。

このシステムは迅速かつスケーラブルである必要があります。この問題を解決するための最良の方法は何ですか?

4

3 に答える 3

1

このトピックについて、役立つブログ投稿を書きました: http://jasonswett.net/blog/composition-a-better-alternative-to-orm-inheritance/

content_itemまず、の代わりにtable などを呼び出すことをお勧めしますcontent。この理由は、テーブル名がそれが表すものの名前と一致する必要があると私が信じているからです。詳細については、私の他のブログ投稿を参照してください。

したがってcontent_item、 というテーブル、 というテーブル、 というテーブルがarticleあるとしますpost。、 などのcontent_item列があります。投稿、記事、その他のいずれであっても、すべてのコンテンツ アイテムに含まれるすべてのものです。次に、 があり、その後に記事固有のものがありますが、記事固有のものだけです。記事ごとにレコードがあり、そのレコードに添付されたレコードがあります。titleslugarticlecontent_item_idcontent_itemarticlecontent_item

これにより、クエリを実行content_itemして、すべてのコンテンツ タイプを含む結果を取得できます。

私は過去にこの種のソリューションを実装して成功しました。(私もさまざまなアプローチを試しましたが、あまり好きではありませんでした。)

于 2012-07-13T16:30:56.593 に答える
0

おそらくこのようなことを試してください。コンテンツを拡張する投稿と記事のニーズは異なる場合がありますが、コンテンツ -> 投稿 (または記事) からの 1.. 多数の関係の代わりに、任意のコンテンツ内でコンテンツを混合/一致させる柔軟性を追加してみませんか。それが必要ない/望まない場合は、article_content テーブルと post_content テーブルを省略し、単に外部キー content_id INT NOT NULL を post テーブルと article テーブルのそれぞれに追加します。


CREATE TABLE IF NOT EXISTS content (id INT NOT NULL AUTO_INCREMENT, title VARCHAR(32) NOT NULL, description VARCHAR(255) NULL, body TEXT, published DATETIME NOT NULL, updated DATETIME NULL, owner_id INT DEFAULT '0', status TINYINT( 1) デフォルト '1', PRIMARY KEY (id), INDEX idx_content_status (status));

CREATE TABLE IF NOT EXISTS article (id INT NOT NULL AUTO_INCREMENT, title VARCHAR(32) NOT NULL, excerpt VARCHAR(255) NULL, url_slug VARCHAR(64) NOT NULL, author_id INT NOT NULL, published DATETIME NOT NULL, updated DATETIME NULL, status TINYINT(1) DEFAULT '1', sort_order INT DEFAULT '1', PRIMARY KEY (id), UNIQUE INDEX idx_article_slug(url_slug), INDEX idx_article_search(title, published, status, sort_order));

CREATE TABLE IF NOT EXISTS post (id INT NOT NULL AUTO_INCREMENT, title VARCHAR(32) NOT NULL, comment VARCHAR(128) NULL, author_id INT NOT NULL, published DATETIME NOT NULL, updated DATETIME NULL, status TINYINT(1) DEFAULT '1 '、主キー (id));

CREATE TABLE IF NOT EXISTS タグ (ID INT NOT NULL AUTO_INCREMENT、タグ VARCHAR(24) NOT NULL、PRIMARY KEY (id));

存在しない場合のテーブルの作成

存在しない場合のテーブルの作成

CREATE TABLE IF NOT EXISTS article_tags (article_id INT NOT NULL, tag_id INT NOT NULL, INDEX idx_article_tag_search(article_id, tag_id));

CREATE TABLE IF NOT EXISTS post_tags (post_id INT NOT NULL, tag_id INT NOT NULL, INDEX idx_post_tag_search(post_id, tag_id));

于 2012-07-13T17:05:56.087 に答える
0

それらが十分に類似したオブジェクトである場合、オプション 3 を使用します... drupals ノードの概念または現在の wordPress の「投稿」のアイデア

于 2012-07-13T15:48:52.983 に答える