0

我真的可以在最佳做法/洞察力方面使用一些很好的反饋意見,以便將事情放入數據庫還是構建數組。舉個例子,你有卡的套裝:數組或數據庫表?

$suits = array('clubs', 'spades', 'hearts', 'diamonds'); 

該陣列可以改變未來,但不是很頻繁,如果在所有。現在這些套裝適用於套牌中的牌。所以,如果我建一個表,該模式將類似於:

create table cards { 
    id INT(11) 
    card_value char(2), 
    suit varchar(8) 
} 

還是更在cards表像建一個suits表並引用ID

create table suits { 
    id INT(11), 
    name varchar(8) 
} 

create table cards { 
    id INT(11), 
    suit_id int(11), 
    card_value char(2) 
} 

是哪個更好的方式去,爲什麼?

回答

2

看了您的評論威爾的反應,我知道西裝和卡是不是你的例子的第一選擇,但我無論如何要去追求的例子:)

我同意這是不可能的西服值將會改變,除非你想要一個足夠靈活的系統來處理塔羅牌(劍,法杖,杯和硬幣)。儘管如此,將數據保存在表中還是有好處的。

第一個是西裝在幾個地方使用。像Bridge和Whist這樣的紙牌遊戲需要知道哪個套牌是王牌。心(黑瑪麗亞,追逐夫人)是一個遊戲,需要能夠區分某些訴訟的卡片進行處罰。所以,有幾個地方引用SUITS.ID會很有用。

第二個好處是套裝有更多的屬性,而不僅僅是名稱。一些遊戲排名適合,例如在橋牌出價三個黑桃中標贏得三顆心。如果我們正在構建一個紙牌遊戲應用程序,我們可能會關聯一個圖像文件或有翼人物來表示卡片符號。

這些考慮都指向你的第二個設計。它是唯一一個避免重複並允許我們強制執行完整性約束的方法。

+0

這有助於很多!這有助於我看到,雖然陣列可以工作,但這不僅僅是眼前的需求。爲了獲得更好的可擴展性,最好將數據放在數據庫中(不管多小),因爲它很可能會在應用程序的其他地方使用。最好從數據庫訪問它,而不是硬編碼的地方。感謝您打開我的心! – 2010-09-08 13:23:46

3

通常我會說你最好將信息存儲在數據庫中,儘管在卡片示例中,我會試着讓代碼中的信息存儲並且存儲從(suit_idx * 13 + card_value),或者使用你在第二個代碼片段中給出的卡片表 - 因爲卡片不太可能改變(特別是一旦你開始在代碼中使用它們)。

在一天結束時 - 如果您打算針對例如'卡',或者針對數據庫中的一副卡片,那麼你會想要使用你的SQL表示 - 前者只是更容易查詢(儘管有一個視圖將卡片連接到適合任何一個選項都很容易查詢 - 儘管我仍然試圖堅持第一個SQL版本)。

+0

是的,我想不出一個更好的例子。這更多的是關於西裝而不是數字。但是,這不是它通常如何運作。我應該堅持原來的汽車色彩理念。衛生署! – 2010-09-07 23:08:50

+0

顏色到你肯定會存儲在數據庫中的汽車 - 你可能會一直在找新汽車 - 而且他們總是能夠夢想着新的顏色 - 所以你的第二個SQL代表 - 規範化 - 就是一個去這裏。 :) – 2010-09-07 23:10:46

+1

這不是一個正常化問題。在第一個表中,沒有任何功能上依賴於「訴訟」欄。如果第一個表有另一個稱爲「colour」的列,那麼它不會被標準化。 – 2010-09-07 23:24:43