2010-07-19 59 views
2

我目前正在構建一個使用PHP和MySQL發佈故事的小型Web應用程序。每個故事可以是一篇文章(有很多字段和數據),只是一個超鏈接/ url,只是一個圖像,或者是具有特定屬性的可下載文件(再次有很多字段)。具有不同內容的連續表

我的問題與找到系統的最佳數據庫佈局有關。我曾考慮過3種不同的解決方案,這些解決方案可能會也可能不起作用(字段僅僅是示例,不會因數據是否應存儲在數據庫中而受到影響):

1)爲每個鍵入並且只是UNION他們。 E.g:

文章
id | date | title | author | preview | last_edited | category | content

超鏈接
id | date | title | author | url

圖片
id | date | title | author | thumbnail | fullimg

文件
id | date | title | author | filetype | filename | filecontent

是否有可能創建一個SQL語句,以這種方式將每個字段添加到來自各個表的行中,並將各個行的「標記」類型取決於哪個表的來源?或者我必須解決的只是常見的領域(3-4字段將是相同的每個表),併爲每個行的單獨查找?

2)根據類型製作某種引用正確表和行的索引表?

索引
id | type | title | date | referenceid - >文章,超鏈接,圖片或文件取決於「類型」字段。

使用外鍵時,這種方式有可能以某種方式嗎?我懷疑沒有,但是不確定你能在MySQL中做什麼,不能做什麼。

3)所有類型的所有字段在同一個表中,只是使特定字段爲空(我不太喜歡這個解決方案,因爲它看起來凌亂)。

任何想法?

我懷疑我不能成爲第一個遇到引用不同實體類型/字段的問題,這取決於某種類型。

想法是高度讚賞。

回答

3

如果你命名字段,那麼你可以非常容易地組合聯盟,並且可以使用任何你喜歡的常量。我一直這樣做:

Select id, 'articles' as tablename, title, author, 
    preview, last_edited, category, '' as url 
from articles 
UNION 
Select id, 'hyperlinks' as tablename, title, author, 
    '' as preview, '' as last_edited, '' as category, url 
From hyperlinks 
... 
+0

這樣解決它的性能損失會是什麼?我對找出可能的解決方案的不同優點和缺點非常感興趣。 – agnsaft 2012-07-06 14:43:46

+0

聯盟本身就很慢。對於SQL Server,UNION ALL要快得多 - 不確定mySQL。但是與其他數據庫一樣,性能取決於太多隔離因素。除非你處理數據庫,否則我不希望這個查詢成爲瓶頸。 – Bill 2012-07-06 16:01:46

1

你有這麼幾個字段,只是把它們放在一個表中,並添加一個類型字段。沒有意義,過於複雜的事情。

2

我建議添加一個stories表作爲中心表。這爲系統設計提供了極大的靈活性,並集中了故事核心數據。沿着這些線路

東西:

stories 
    id 
    date 
    title 
    author 
    article_id 
    hyperlink_id 
    picture_id 
    file_id 

articles 
    id 
    preview 
    last_edited 
    category 
    content 

hyperlinks 
    id 
    url 

pictures 
    id 
    thumb 
    full 

files 
    id 
    filetype 
    filename 
    filecontent 
+0

如果article_id與該特定條目不相關,那麼是否會出現與外鍵相關的問題? – agnsaft 2012-07-06 14:46:26

+0

FKs可以爲空 – Donnie 2012-08-07 21:41:42

1

我想補充一個「類型」列各指定什麼表它是從哪裏來的表,然後做一個等值連接跟着一羣:

SELECT * 
FROM articles a INNER JOIN hyperlinks h 
    ON a.id =h.id AND a.date=h.date AND a.title=h.title AND a.author=h.author 
    JOIN pictures p ON h.id=p.id AND h.date=p.date AND h.title=p.title AND h.author=p.author JOIN files f 
    ON p.id=f.id AND p.date=f.date AND p.title=f.title AND p.author=f.author 
ORDER BY type; 

這是一個看起來醜陋的查詢,但它應該做你想要的...

+0

以這種方式解決它會有什麼性能損失? – agnsaft 2012-07-06 14:42:07

相關問題