我可以在mysql中以字符串格式存储和存档吗?

时间:2017-10-01 22:14:47

标签: javascript mysql schema

或更好,这是一种好的做法吗?

我想存储书签,每个书签都有一行。我想要一个标签列,它是一个字符串格式的数组,它包含定义它的标签层次结构。例如:

url | tag
'stackoverflow.com', '[faves, internet, QandA]'

我当前的表格如下,我只想修改tag列以字符串形式保存数组。

enter code here

1 个答案:

答案 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?

的回答