【问题标题】:Can I store and arrary in string format in mysql? [duplicate]我可以在mysql中以字符串格式存储数组吗? [复制]
【发布时间】:2018-03-13 01:06:29
【问题描述】:

或者更好,这是好的做法吗?

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

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

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

【问题讨论】:

  • 不,这根本不是一个好习惯。通过将标签存储在字符串中,您将失去某些能力,例如在条件中使用标签。考虑为标签创建一个新表。

标签: javascript mysql schema


【解决方案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?的回复

【讨论】:

  • 如果您已经在另一个问题中回答了这个问题,那么您应该投票关闭该问题作为重复问题,您不应该再次回答。
  • @Shadow,即使答案相同,问题也不相同。如果我以重复的形式关闭问题,我很可能会收到其他用户的投诉,说我关闭不当。
  • 他们是。两者都询问在单个字段中以分隔格式存储数据是否是个好主意。
  • 这是一个判断电话。我很清楚如何使用 Stack Overflow。
  • 对不起。表结构有什么建议?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2012-10-30
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多