2011-04-12 68 views
9

我有一個關於我的實現想法是否容易處理/寫查詢的問題。MySQL數據庫列有多個值

我目前有一個數據庫與多個列。大多數列是相同的東西(項目,但分爲項目1,項目2,項目3等)。

所以,我現在在我的數據庫ID,名稱,第1項,第2項.....項目10

我想凝結成ID,名稱,項目這一點。

但我想要的項目是將多個值存儲爲不同的行。即

ID = One Name = Hello Item = This 
           That 
           There 

有點像它看起來像的格式。這是一個好主意,我該如何去做這件事?我將在數據庫中使用任何數字,並且所有信息都是靜態的,並且永遠不會改變。

我可以使用1個數據庫表(這將很容易將一個ID的項目與另一個ID匹配),還是我需要創建2個表並將它們鏈接起來?

如果是這樣,我將如何創建2個表並使它們成爲關係?

關於如何實現這個的任何想法?謝謝!

+0

我認爲你的問題可能是過於具體。你試圖完成的更廣泛的目標是什麼? – 2011-04-12 03:03:20

+1

下面的答案非常清楚 - 你有什麼經典案例是爲什麼數據庫將數據存儲在多個表中,通過數字交叉引用行(又名「鍵」)。 – boisvert 2011-04-13 14:09:53

回答

2

我不認爲在這種情況下一張桌子真的有意義。相反,你可以這樣做:

Main Table: 
ID 
Name 

Item Table: 
ID 
Item # 
Item Value 
Main_ID = Main Table.ID 

然後當你查詢您可以做一個簡單的加入

6

這是一個經典的類型非規範化的數據基礎。非規範化有時會使某些操作更高效,但更多時候會導致效率低下。 (例如,如果其中一個寫查詢要更改與id關聯的名稱,則必須更改許多行而不是單個行。)非規範化操作應僅在特定原因下完成完全標準化的數據庫已被設計。在你的榜樣,歸一化的數據庫設計是:

TABLE_1:ID(鍵),名稱
TABLE_2:ID(外鍵映射到table_1.ID),項目

4

你談論一個非規範化表格,哪些SQL數據庫難以處理。您的項目字段據說與其他字段具有多對一的關係。正確的做法是製作兩個表格。典型的例子是一張專輯和歌曲。歌曲有很多一對一關係到相冊,所以你可以構建你這樣的ABLES:

Table Album 
album_id [Primary Key] 
Title 
Artist 

Table Song 
song_id [Primary Key] 
album_id [Foreign Key album.album_id] 
Title 

通常這個例子與第三個表藝術家給,你可以代替藝術家字段爲artist_id場這是藝術家表的artist_id的外鍵。

當然,在現實中,歌曲,專輯和藝術家更爲複雜。一首歌可以放在多張專輯中,多張專輯可以放在一張專輯中,同一首歌有多種版本,甚至有些歌曲根本沒有專輯發行。

例子:

Album 
album_id Title  Artist 
1  White  Beatles 
2  Black  Metallica 

Song 
song_id album_id Title 
1  2   Enter Sandman 
2  1   Back in the USSR 
3  2   Sad but True 
4  2   Nothing Else Matters 
5  1   Helter Skelter 

查詢這個你只是做一個JOIN: SELECT * FROM Album INNER JOIN Song ON Album.album_id = Song.album_id

+0

upvote爲黑色/白色專輯名稱 – d512 2015-03-16 19:09:24