【问题标题】:MySQL - Storing a long list of itemsMySQL - 存储一长串项目
【发布时间】:2021-05-17 18:17:53
【问题描述】:

我有一些数据想存储在表格中。此数据是具有id(字符串)和名为source(字符串)的属性的项目列表。我想做的方式是制作一个表A,它有两列:source(varchar)和items(set)。假设每个来源有 20 个项目,总共有 200 个项目。如果我想这样做,我将无法使用 SET 来执行此操作,因为它有 64 个值的限制,因此在创建表时我将无法指定项目的所有可用选项。

既然我们在上下文中,我想出了两个选项:

  1. 按照我需要的相同结构创建尽可能多的表,每个表有 64 个值(T1:1-64、T2:65-128 等)——我认为这不是一个很好的选择,但它是一个选项。

  2. 不要使用集合,而是创建与项目一样多的行,即列 source(varchar) 和 id(varchar) -- 另一个我不太喜欢的选项,因为我需要创建很多行,每当我需要提出请求时,它可能需要遍历整个表。不过还是比选项 1 好。

有没有什么方法可以通过更简洁(而且计算成本更低)的解决方案来实现这一目标? 谢谢。

【问题讨论】:

  • 您提到了 MySQL,所以大概您正在考虑使用关系数据库。如果是这样,那么您的选择仅限于 1:标准化。
  • 共有 200 项。如果我想这样做,我将无法使用 SET 来执行此操作,因为它有 64 个值的限制,因此在创建表时我将无法指定项目的所有可用选项。 在表中使用 4 列 SET 类型。或者使用一个 BINARY(32) 列。
  • @Akina 这实际上是我没有想到的,听起来不错,但问题是项目的数量可能会增加,如果达到 257,我需要手动创建一个列和设置值。好的方法,谢谢!

标签: mysql database list set


【解决方案1】:

你说物品有一个属性source。但是,您希望将数据存储为好像项目列表是每个源的属性一样?

这听起来确实像是项目和来源之间存在多对多关系。这是在关系数据库中执行此操作的典型解决方案:

CREATE TABLE items ( item_id INT PRIMARY KEY );

CREATE TABLE sources ( source_id INT PRIMARY KEY );

CREATE TABLE item_sources (
  item_id INT NOT NULL,
  source_id INT NOT NULL,
  PRIMARY KEY (item_id, source_id),
  FOREIGN KEY (item_id) REFERENCES items (item_id),
  FOREIGN KEY (source_id) REFERENCES sources (source_id)
);
  • 每次将项目分配给源时,在 item_sources 中存储一行。
  • 您想拥有多少就拥有多少。
  • 只需插入一行即可轻松添加另一个。
  • 删除一行很容易。
  • 很容易获取给定来源的项目。
  • 很容易获取给定项目的来源。
  • 很容易对它们进行计数或排序,或者找出哪些项目最受欢迎,或者做任何你想做的事情。

您只询问了如何存储它们,您没有确定需要进行的任何查询。但是由于缺少有关特定查询的任何信息,您应该默认使用上述规范化的表结构。

如果您想针对某些特定查询进行优化,您可以选择非规范化,但要做到这一点,您必须牢记特定查询。在知道要优化的查询之前,您无法选择非规范化的方式。

请记住,如果您针对一种类型的查询进行优化,这将以牺牲其他类型的查询为代价。

规范化是在您可以以合理效率运行的查询类型方面保持灵活性的最佳方式。

【讨论】:

  • 我想收集项目并按source 对它们进行排序,作为一个集合。我需要使用所有项目(具有属性源)向 API 提出请愿,并且我必须按源对它们进行分类。获得所有列表后,我需要使用所有项目 ID 更新表 items 列。几乎是多对多,但由于我正在向 API 提出请愿,我不想存储大量数据,因此选项 2 几乎就是您所描述的,这就是我最终会做。谢谢!!
  • 您可能希望在查询中使用GROUP_CONCAT() 函数来返回每个源项的结果。
  • 非常感谢!这对于从数据库中检索数据非常有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 2013-03-02
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多