MySQL / MariaDB -大量列的策略[重复]

r1zk6ea1  于 2023-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(134)
    • 此问题已在此处有答案**:

How to design the database when you need too many columns? [duplicate](4个答案)
11天前关闭
我即将设计一个数据库,我将有来自多个数据源的帧到达,在不同的时间。这些帧中的每一个将需要被分解并转换成工程单元,以用于存储到具有适当数据类型(例如,FLOAT,INT)。因此,一般结构将是主键的DATETIME数据类型,其余列将是这些转换后的值中的每一个。这将使所有内容与正确的接收时间保持一致。
对于我的大多数表(表示每个数据源/帧),列计数相对较小,只有几百列。然而,将有一个看起来有大约10,000列。根据以前的经验,我知道对于最大列数(4,096)和完整的行大小(65,536字节)都有硬性限制。
以前,我会将其拆分为“相邻”的表,如tableA_000,tableA_001等,每个表包含任意数量的列,但仍然使用相同的主键(time)。但是这样做会变得有点混乱,也就是说,当我想找到一些东西时,我必须创建一个单独的查找表来首先引用。(例如,“colVoltage在tableA_007中”,“colTimer在tableB_003中”)我当然可以以这种方式再次这样做,但我很好奇……还有谁有不同的策略来处理这个问题吗在理想的情况下,尽管有这么多列,我还是能够插入和选择(对我来说)看起来像一个大表的东西。
MariaDB 10.11.3/CentOS 8

bf1o4zei

bf1o4zei1#

我个人认为这听起来像是一种文档存储的用例。创建具有如此多列的表可能很快变得难以管理。你可以在MySQL中使用JSON数据类型来实现这一点,它在一个表中提供了一个非常灵活的数据结构。还可以使用生成的列为数据中常见的数据元素创建快速索引。
我还想问你为什么使用DATETIME作为主键,肯定有冲突的可能性吗?下面是我的create语句:

CREATE TABLE frames (   
  id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  type VARCHAR(50) NOT NULL,
  data JSON NOT NULL,
  example_key INT GENERATED ALWAYS AS (data->"$.example_key"),
  INDEX(created),
  INDEX(type),
  INDEX(example_key)
);

MySQL文档在这方面很好,在https://dev.mysql.com/doc/refman/8.0/en/json.html和https://dev.mysql.com/doc/refman/8.0/en/create-table-secondary-indexes.html#json-column-indirect-index
显然,还有其他数据库引擎专门设计为以这种方式运行,如果这是您的应用程序的唯一功能,并且不需要其他位的关系数据库,这可能是一个更好的选择。还要记住,JSON类型可能会有点慢,因为如果使用SELECT,最终会为返回的每条记录提取该字段的全部内容。再次生成的字段可以是好的。

相关问题