或更好,这是一种好的做法吗?
我想存储书签,每个书签都有一行。我想要一个标签列,它是一个字符串格式的数组,它包含定义它的标签层次结构。例如:
url | tag
'stackoverflow.com', '[faves, internet, QandA]'
我当前的表格如下,我只想修改tag
列以字符串形式保存数组。
答案 0 :(得分:1)
不,在字符串中存储以逗号分隔的列表通常不是一个好主意。
例外:如果您的查询始终将整个字符串视为字符串,并且您不需要使用SQL表达式来搜索单个元素,那么这样做没有任何害处。
在SQL中,最好将每列视为单个标量值,而不是数组。如果将列视为可以分解为子部分的内容,则使用数据会变得笨拙且效率低下。
对于您的标记,您应该有一对多标记表,以便每个标记可以被许多标记引用,标记表中每行一个。
或者实际上是一个标签查找表,然后是一个多对多表映射书签到它们的标签。
CREATE TABLE Tag (
tag_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
tag VARCHAR(50) NOT NULL
);
CREATE TABLE BookmarkTag (
bookmark_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (bookmark_id, tag_id),
FOREIGN KEY (bookmark_id) REFERENCES Bookmark(bookmark_id),
FOREIGN KEY (tag_id) REFERENCES Tag(tag_id)
);
这为您提供了更大的灵活性,例如:
另请参阅我对Is storing a delimited list in a database column really that bad?
的回答