我有一个数据集,其中包含ID和与该ID相关的矩阵(n×n)数据。
列名(A,B,C,D)和行名称(1,2,3)也很重要,需要为每个单独的ID以及数据(a1,b1, C1,D1,...)
例如:
我正在尝试确定在数据库中建模此数据集的最佳方法,但是,考虑到RDBMS的扁平性,它看起来很难。
我最好持有ID和表示数据矩阵的XML blob,或者我在这里忽略了一个更简单的解决方案。
感谢。
答案 0 :(得分:31)
RDBMS不平坦。 R部分看到了这一点。你需要的是:
Table Entity
------------
ID
Table EntityData
----------------
EntityID
MatrixRow (1, 2, 3...)
MatrixColumn (A, B, C, D...)
Value
Entity:EntityData
是一对多的关系;矩阵中的每个单元格都有一个EntityData行。
现在您有一个可以在SQL级别进行分析的模式,而不仅仅是一个数据转储,您必须在应用程序级别提取并提取所有内容才能找到有关它的任何内容。
答案 1 :(得分:6)
这是PostgreSQL支持数组作为数据类型的原因之一。见
如果显示,您可以使用ARRAY[[1,2,3],[4,5,6],[7,8,9]]
之类的语法来定义3x3矩阵的值,或val integer[3][3]
将列类型声明为3x3矩阵。
当然这不是标准的SQL,而是PostgreSQL特有的。其他数据库可能有类似但略有不同的实现。
答案 2 :(得分:4)
如果你想要一个真正的关系解决方案:
Matrix
------
id
Matrix_Cell
-----------
matrix_id
row
col
value
但确保你拥有有效数据的限制将是可怕的。
就DB而言,我会将矩阵视为单个值,并将其存储为 CSV:
Matrix
------
id
cols
data
哪个比XML轻一点。
答案 3 :(得分:1)
我可能会这样实现:
Table MatrixData
----------------
id
rowName
columnName
datapoint
如果您要查找的只是存储数据,则此结构将包含任何大小的矩阵,并允许您重新构建ID中的任何矩阵。您将需要一些后处理以“矩阵格式”呈现它,但这就是前端代码的用途。
答案 4 :(得分:0)
可以将数据视为“行数据”吗?如果是这样,那么也许你可以将每一行存储为具有数据A,B,C,D的对象(或XML Blob),然后在“表示”中使用类似LinkedHashMap(假设Java)的东西来获取对象ID键。
此外,似乎从它的基本性质来看,典型的数据库表已经做了你需要的不是吗?
答案 5 :(得分:-1)
或者更好的是你可以做的是,创建一个像结构一样的逻辑数组。 假设你想存储一个m X n数组.. 在表中创建m个属性。 在每个属性存储中,n个元素由分隔符分隔......
在检索数据时,只需进行反向解析即可轻松恢复数据。