如何在 MySQL 中存储列表

ant*_*ius 5 mysql sql database

我正在开发一个网站并且我是 mySQL 的新手,所以我不确定最好的方法来解决这个问题。

我需要存储坐标对数组(3d 数组)的数组。每个子数组中有多少坐标对没有上限,每个数组中有多少个子数组也没有上限。我将始终一次访问整个数组。

每个子数组还有两个不同的字符串伴随它们。

如果我有一个包含所有坐标对的表格,它会不会效率低下?特别是因为我在查询时总是会寻找一整套坐标,而且我永远不需要查询一对单独的坐标?

为清楚起见,以下是此类数组的示例:

[
  ["label1", "path1", [10,5], [100,40], [90,70], [50,2], [900,7] ],
  ["label2", "path2", [30,15], [17,54], [19,12], [33,22], [83,74], [34,4], [93,6] ],
  ["label3", "path3", [47,93], [9,56], [69,70], [47,5] ]
]
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 1

您可以将其存储为 SQL 中的两个表。我正在编名字。

create table paths (
    pathid int auto_increment primary key,
    label varchar(255),
    path varchar(255)
);

create table coordinates (
    coordinateid int auto_increment primary key,
    pathid int not null
    x int,
    y int,
    constraint fk_coordinates_pathid foreign key (pathid) references paths(pathid)
);
Run Code Online (Sandbox Code Playgroud)

然后,您将构造您需要的“数组”或组件。

话虽如此,如果数组确实是您仅在应用程序端使用的对象,那么您可能希望将其存储为单个对象。当然,这就引出了一个问题:为什么要为此使用关系数据库。我强烈建议将数据存储为正确的 SQL 表。但该设施可用:

create table arrays (
    arrayid int auto_increment primary key,
    arraystuff blob
);
Run Code Online (Sandbox Code Playgroud)

我用blob的是夸张的说法。通常 JSON 或文本字符串是合适的。实际的位表示仅在某些情况下有用(例如图像)。

您可以存储应用程序中实际使用的表示形式,或者实际上是它的序列化版本。但是,您无法从中获得任何SQL 功能,例如能够计算坐标数或获取仅具有特定名称的行。