2013-03-05 45 views
0

我爲我的漫畫網站實現了一個SO風格的標記系統。PHP:標記系統JOIN語句

每個漫畫都可以有1個或多個標籤。

我現在設置的方式是:有一個漫畫表,標記表和關係comictags表。該查詢將檢查是否有匹配的漫畫標識和標籤ID ...

$sql = 
"SELECT c.*, t.* 
FROM comics c 
INNER JOIN comictags ct ON (c.id = ct.comicID) 
INNER JOIN tags t ON (t.tagid = ct.tagID) 
WHERE ct.tagID IN ('" . implode(', ', $_SESSION['tagids']). "') 
". $catquery ." " . $order; 

enter image description here

的問題,這是它迫使我添加新條目我想每次到comictags表添加一個新的標籤到漫畫ID。

是否有可能擁有更多此模式:?

comicid_1: tagid_1, tagid_2, tagid_3, etc...

含義,我爲每個漫畫ID 1項,並添加一個逗號分隔標籤的ID在tagid領域我想相關的每個標籤。

謝謝!

+0

我唯一要做的就是放棄'ComicsTags.id'。你的主鍵是'(imgid,tagid)',爲什麼添加更多不需要的數據? – Wrikken 2013-03-05 18:15:07

+0

@Wrikken你在說什麼? – Growler 2013-03-05 18:22:18

+0

「ComicsTags」表中的「id」列。到底有什麼好處呢?它不添加任何東西。 – Wrikken 2013-03-05 18:24:42

回答

2

你現在這樣做的方式非常好。你打算做的不是。它違反了first normal form:每個屬性可能只包含原子值。

當然,這是可能的。例如,通過爲tagid列使用字符串類型。但是這會使很多查詢變得複雜,並且可能不利於性能。

+0

好的,但我不明白它在當前狀態下的原子狀態。我仍然不明白如何爲每個漫畫ID添加逗號分隔標籤會產生問題 – Growler 2013-03-05 18:06:02

+0

原子應該是什麼? – Oswald 2013-03-05 18:06:34

+0

@Growler:想象一下查詢所有具有特定標籤ID的漫畫。如果ID是1列,那很可怕。多個表現不好的LIKE是你在當時可以管理的最好的,這需要全表掃描。 – Wrikken 2013-03-05 18:13:56

1

我不知道任何簡單的SQL expresion這樣的:

INSERT INTO ComicsTags VALUES (1, 10), (1,20), (1,30); 

對於腳本語言水平,你可以寫方法模型,該表允許你這樣做,稍微簡單一些:

$comicsTags = new ComicsTags(); 
$tags = array(10, 20,30); 
$comicsTags->add(1, $tags);