2010-04-15 78 views
2

我有一個遊戲桌,它包含關於遊戲的數據。 然後是另一張包含新聞數據的表格。如何將一張桌子與另一張桌子關聯起來作爲將來的記錄

到目前爲止這麼好。

首先,我想到了爲game_news創建一個聯結表,這樣我就可以將新聞與遊戲聯繫起來。

這種方式在遊戲存在時按預期工作。所以,無論何時我插入一條新聞,我都可以使用聯結表將它與遊戲相關聯。

但有些情況下,有關於遊戲的消息,但遊戲未發佈且不存在。

所以我的問題是;有沒有辦法在創建遊戲記錄時將這些新聞與特定遊戲聯繫起來。

這樣做的最好方法是什麼?有任何想法嗎?

回答

2

聯結表是要走的路。如果一篇新聞文章涉及多個遊戲,那麼你需要它。爲了處理尚不存在的遊戲,只需爲它們插入一行,包括目前所知道的所有信息(可能來自新聞報道),並且有一個狀態欄標記爲尚未發佈。有了這個設置

Games 
GameID   int   not null auto increment PK 
GameStatus  char(1)  not null "P"=published, "N"=not released yet, "R"=game is only a rumor 
GameReleaseDate date   null 
GameName   varchar(...) not null 
GameDescription... 
... 

News 
NewsID  int    not null auto increment PK 
NewsTitle varchar(...)  not null 
... 

GameNews 
GameNewsID int auto increment PK 
GameID  int FK to Games.GameID 
NewsID  int FK to News.NewsID 

你可以與單個新聞項的多個遊戲:可以顯示這個遊戲是沒有或謠言發佈等

的桌子了這樣的事情。只需插入所有適當的GameNews行,將每個遊戲鏈接到新聞行。

如果遊戲尚未發佈,您仍然可以通過創建狀態爲「N」或「R」的遊戲行(或類似的東西)並使用GameNews表格爲已發佈的遊戲。您可以使用盡可能多的信息填充遊戲內的所有字段,並在您瞭解詳情後進行更新。最後你會在遊戲行中有完整的遊戲信息(在遊戲發佈後),它會鏈接到所有的新聞行,即使它只是新聞中的傳聞。

爲了給你一個關於我在說什麼的想法,下面是一個「傳聞」遊戲的數據隨着時間的推移會是什麼樣子的示例(這是一個簡化的例子,沒有多個遊戲每行新聞) :

data as of 1/1/2010 
    Games GameID GameStatus GameReleaseDate GameName 
      1234 "R"   1/1/2012   "God of War 4" 
    News  NewsID NewsTitle 
      543  "Future Of Games" 
    GameNews GameNewsID GameID NewsID 
      768   1234 543 

data as of 4/1/2010 
    Games GameID GameStatus GameReleaseDate GameName 
      1234 "R"   1/1/2012   "God of War 4" 
    News  NewsID NewsTitle 
      543  "Future Of Games" 
      544  "Interview with John Hight" 
    GameNews GameNewsID GameID NewsID 
      768   1234 543 
      769   1234 544 

data as of 11/20/2010 
    Games GameID GameStatus GameReleaseDate GameName 
      1234 "N"   12/31/2011   "God of War IV" 
    News  NewsID NewsTitle 
      543  "Future Of Games" 
      544  "Interview with John Hight" 
      545  "God of War Expected Next Year" 
    GameNews GameNewsID GameID NewsID 
      768   1234 543 
      769   1234 544 
      770   1234 545 

data as of 8/15/2011 
    Games GameID GameStatus GameReleaseDate GameName 
      1234 "N"   12/01/2011   "God of War IV" 
    News  NewsID NewsTitle 
      543  "Future Of Games" 
      544  "Interview with John Hight" 
      545  "God of War Expected Next Year" 
      546  "Retailers Get Ready For New Games" 
    GameNews GameNewsID GameID NewsID 
      768   1234 543 
      769   1234 544 
      770   1234 545 
      771   1234 546 

data as of 1/1/2012 
    Games GameID GameStatus GameReleaseDate GameName 
      1234 "P"   12/01/2011   "God of War IV" 
    News  NewsID NewsTitle 
      543  "Future Of Games" 
      544  "Interview with John Hight" 
      545  "God of War Expected Next Year" 
      546  "Retailers Get Ready For New Games" 
      547  "God of War IV Review" 
    GameNews GameNewsID GameID NewsID 
      768   1234 543 
      769   1234 544 
      770   1234 545 
      771   1234 546 
      772   1234 547 

如果在1/1/2012你看News.NewsID = 543,你會看到,它鏈接到完成並審查Games.GameID = 1234,即使News.NewsID = 543文章是關於一個「傳聞」即將到來的版本的戰爭之神。所有這些都是在沒有對舊的新聞或GameNews行進行任何更改的情況下完成的。

1

最簡單的答案是從新聞到遊戲都有一個外鍵。如果您正在爲尚不存在的遊戲創建新聞,只需在遊戲表中創建一個存根記錄即可。如果需要,您可以將其標記爲此。當你添加遊戲時,只需填充這個存根記錄。

2

你有3個選擇 - 1是在'遊戲'表上設置一個標誌來表示它是否被釋放,並且只顯示遊戲未發佈的名稱(甚至不顯示)。

另一種是在添加遊戲項目並將其鏈接後編輯新聞項目。因爲在添加遊戲之前,您無法分辨出唯一的ID。

第三個UNRECOMMENDED選項是通過遊戲名稱而不是主鍵鏈接它們,因此在新聞表中有一個名爲game_name的列,並且它以這種方式鏈接表。然而,如果你拼錯了東西,那將會失敗,並且遠不如選項1或2好。

1

將兩個外鍵放在聯結表中是一個好主意。外鍵引用存在的東西。執行此操作稱爲「參照完整性」。允許提及不存在的物品是混亂之路。

如果您獲得關於尚未存在的遊戲的新聞文章(在數據庫中),您基本上有兩種選擇:將遊戲添加到遊戲表中,然後在交接表中添加對遊戲的引用;或者,暫時忽略文章和遊戲之間的關係。

+0

我在考慮省略關係。這對我來說似乎是最好的方式。不過,假設我爲2年後創建的戰神4創造了許多新聞記錄。 現在遊戲發佈的年代將會創建,但我怎麼知道哪些記錄與遊戲相關?一些標籤系統可能?我真的不確定。 – Sinan 2010-04-16 14:53:18

1

「但是有些情況下有關於遊戲的消息,但遊戲未發佈且不存在。」

你應該把你的想法理解爲「存在」的意思。如果某種東西不存在,那麼就沒有任何東西可以與它有關。

如果您的商業現實包含「存在併爲公衆所知」與「現存的,但僅限於私人並且不爲公衆所知」之間的差異,那麼您的模型應該承認並反映這一現實。

將信息與「存在但未公開」的任何事物聯繫起來是完全可能的。將信息與任何不存在的事物聯繫起來是不可能的。

相關問題