2013-08-29 49 views
0

在瀏覽9gag.com時,出現了一個想法(問題)。假設我想創建一個網站,用戶可以添加不同種類的條目。現在每個條目都是diffirent類型,需要diffirent/additional列。獲取記錄結構相同的方式只是部分

比方說,我們可以添加:

  • YouTube視頻
  • 一個引用這需要引用的作者名和姓
  • 閃光遊戲,需要額外的遊戲類別,描述,流派等。
  • 需要鏈接的圖像

現在所有的上述全部項目,並有一些colu (如id,add_date,adding_user_id等)和一些diffirent/additional(例如:只有Flash遊戲需要描述或只需要指定圖像需要plus_18列)。問題是我應該如何組織DB /代碼來控制上述所有條目?我可能要命令他們,或者add_date等搜索條目...

想出了我的腦海裏的想法:

  1. 添加一個「類型」列指定它是什麼條目,並添加所有允許NULL與這個特定類型列無關的可能列。但這是非常討厭的。沒有數據集成。
  2. 爲附加數據添加一些帶有序列化數據的列,但它使得任何過濾都是一團糟。
  3. 爲條目創建主(父)表,併爲具體條目類型(它們的附加列/信息)分隔表。但在這裏,我甚至不知道我應該如何恰當地選擇數據,並且只是很討厭。

那麼解決這個問題最好的辦法是什麼?

回答

1

父表似乎是最好的選擇。

// This is the parent table 
Entry 
    ID PK 
    Common fields 

Video 
    ID PK 
    EntryID FK 
    Unique fields 

Game 
    ID PK 
    EntryID FK 
    Unique fields 

... 

查詢的樣子很大程度上取決於查詢的類型。 ,例如,獲得了一定日期排序的所有比賽,查詢看起來像:

SELECT * 
FROM Game 
JOIN Entry ON Game.EntryID = Entry.ID 
ORDER BY Entry.AddDate 

要獲得所有內容是按日期順序,將有些凌亂。例如:

SELECT * 
FROM Entry 
LEFT JOIN Game ON Game.EntryID = Entry.ID 
LEFT JOIN Video ON Video.EntryID = Entry.ID 
... 
ORDER BY Entry.AddDate 

如果你想運行類似上面的問題,我建議你給唯一的名稱到您的主鍵字段(即VideoIDGameID),這樣你可以很容易地識別你是哪種類型的條目處理(例如,通過檢查GameID IS NOT NULL)。

或者你可以在Entry添加Type場。

相關問題