首页 > 解决方案 > MySQL - 存储一长串项目

问题描述

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

所以现在我们在上下文中,我想出了两个选项:

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

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

有没有什么方法可以通过更干净(更便宜的计算方式)解决方案来实现这一目标?谢谢。

标签: mysqldatabaselistset

解决方案


你说物品有一个属性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每次将项目分配给源时,存储一行。
  • 您可以拥有任意数量的。
  • 只需插入一行即可轻松添加另一个。
  • 通过删除一行很容易删除一个。
  • 获取给定来源的项目很容易。
  • 获取给定项目的来源很容易。
  • 很容易对它们进行计数或排序,或者找出哪些项目最受欢迎,或者做任何你想做的事情。

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

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

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

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


推荐阅读