2012-07-13 97 views
2

我們將創建一個MySQL數據庫,以反映下面的PHP類:推薦MySQL數據模型對象

  • 內容
  • 延伸條內容
  • 柱延伸內容
  • ...

將有與內容相關的模型,如評論,忽略等。

這裏的問題是要使用哪種數據模型。

1)每模型

2)一個大的內容表格(包括所有類屬性爲列),以及用於其他車型單個表的一個表。我相信它被稱爲單表繼承。

3)一個大的內容表,包含公共字段,或者只有我們通常搜索的字段(索引),外加一個大型的內容數據表以及其餘的屬性。

4)另一種方式?

我們希望能夠根據內容進行查詢,並獲取最近的,基於位置的或過濾的內容,而不管它是哪種內容類型(子類)。因此解決方案1可能不存在問題。

該系統應該快速且可擴展。解決這個問題的最好方法是什麼?

+0

就個人而言,我通常選擇2,因爲選項3讓人聯想到EAV,許多頂尖開發者認爲它是反模式。 – 2012-07-13 16:01:28

+0

您可以簡單地查看WordPress模式並複製該模式。爲什麼重新發明輪子? – 2012-07-13 16:43:53

回答

1

我寫了一篇博客文章關於這個話題,你會發現在當前使用的WordPress想法有幫助的:http://jasonswett.net/blog/composition-a-better-alternative-to-orm-inheritance/

首先,我想建議您致電content_itemcontent之類的東西。這是因爲我相信表名應該與它代表的東西的名稱相匹配。有關詳情,請參閱this other blog post of mine

因此,您可能有一個名爲content_item的表格,一個名爲article的表格和一個名爲post的表格。 content_item將有像title,slug等列 - 每個內容項目將具有的所有內容,無論是帖子,文章還是其他內容。然後article將有一個content_item_id然後其他任何特定的文章,但只有什麼是特定的文章。對於每篇文章,您將有一條content_item記錄,然後是一條article記錄,該記錄附加到該content_item記錄。

這將使您能夠查詢content_item並獲得包含所有內容類型的結果。

我在過去很成功地實現了這種解決方案。 (我也嘗試過不同的方法,並不像他們那樣多。)

+1

我同意content_item的命名。 – preyz 2012-07-13 17:26:17

+0

你會如何查詢這種數據庫,如果說,你想要100個最近的內容項目?這裏的問題是,你希望加入不同的表格,這取決於content_item的類型(文章,文章等)。 – preyz 2012-07-13 17:26:49

+0

'SELECT * FROM content_item JOIN文章ON article.content_item_id = content_item.id JOIN post ON post.content_item_id = content_item.id ORDER BY content_item.id DESC LIMIT 100' – 2012-07-13 17:38:22

0

如果他們有足夠相似的對象,我會用選項3 ...一拉drupals節點的概念或一個「後」

0

嘗試類似這樣的事情吧。你對後期的需求vs.文章擴展內容可能會有所不同,但不是從內容 - >文章(或文章)的1..many關係,爲什麼不增加靈活性混合/匹配任何內容。如果你不需要/願望,然後省略article_content和POST_CONTENT表,只需添加一個外鍵的content_id INT NOT NULL到各自分別的帖子和文章表..


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)DEFAULT'1 ',PRIMARY KEY(id),INDEX idx_content_status(status)); (32)NOT NULL,excerpt VARCHAR(255)NULL,url_slug VARCHAR(64)NOT NULL,author_id INT NOT NULL,發佈DATETIME NOT NULL,發佈時間:2013年11月30日已更新DATETIME NULL,狀態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));如果不存在,則返回NULL,否則返回NULL。DATETIME NULL,status TINYINT(1)發佈時間:15年07月08日原作者: )DEFAULT'1',PRIMARY KEY(id)); (id INT NULL NOT NULL AUTO_INCREMENT,tag VARCHAR(24)NOT NULL,PRIMARY KEY(id)); article_id INT NOT NULL,content_id INT NOT NULL,狀態TINYINT(1)DEFAULT'1',sort_order INT DEFAULT'1',INDEX idx_article_content_search(article_id,content_id,status,sort_order))創建表格IF NOT EXISTS ; (1)DEFAULT'1',sort_order INT DEFAULT'1',INDEX idx_post_content_search(post_id,content_id,status,sort_order))如果不存在,則返回一個新的數組。 ; (article_id INT NOT NULL,tag_id INT NOT NULL,INDEX idx_article_tag_search(article_id,tag_id)); (Post_id INT NOT NULL,tag_id INT NOT NULL,INDEX idx_post_tag_search(post_id,tag_id));如果不存在,則返回true。

+0

你會如何查詢這種數據庫,如果說,你想要100個最近的內容項目?這裏的問題是,你希望加入不同的表格,這取決於content_item的類型(文章,文章等)。 – preyz 2012-07-13 17:28:06