我已经在我的漫画网站上实现了一个SO风格的标记系统。
每个漫画都可以有1个或多个标签。
我目前设置的方式是:有漫画表,标签表和关系漫画表。查询将检查是否存在匹配的漫画ID和标记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;
这个问题是每次我想在漫画ID中添加新标签时,它会强制我向comictags表添加一个新条目。
是否可以拥有更多此架构:?
comicid_1: tagid_1, tagid_2, tagid_3, etc...
意思是,我为每个漫画ID输入1个条目,并在tagid
字段中为我想要关联的每个标记添加逗号分隔的标记ID。
谢谢!
答案 0 :(得分:2)
你现在这样做的方式非常好。你打算做的不是。它违反了first normal form:每个属性可能只包含原子值。
当然,这是可能的。例如,通过为tagid列使用字符串类型。但这会使很多查询变得复杂,并且可能对性能不利。
答案 1 :(得分:1)
我不知道任何更简单的sql表达式:
INSERT INTO ComicsTags VALUES (1, 10), (1,20), (1,30);
对于脚本语言级别,您可以为该表编写模型的方法,这样可以更简单一些:
$comicsTags = new ComicsTags();
$tags = array(10, 20,30);
$comicsTags->add(1, $tags);