存储浮点数列表与非规范化为多行有区别吗?
Is there difference in storing a list of floats vs. denormalising into multiple rows?
我需要在 Cassandra 中为每条记录存储多个浮点数。我当前的架构如下所示:
CREATE
TABLE
data_point
( account ASCII
, groupkey TINYINT
, productid TEXT
, vectors LIST<FLOAT>
, PRIMARY KEY ((account, groupkey), productid))
WITH CLUSTERING
ORDER
BY
( productid ASC
);
每条记录有1280个浮点数。这些行一旦插入,就永远不会更新或删除。虽然这可行,但我一直在考虑是否最好将它们放在单独的 1280 行中。
CREATE
TABLE
data_point
( account ASCII
, groupkey TINYINT
, productid TEXT
, vector FLOAT
, PRIMARY KEY ((account, groupkey), productid))
WITH CLUSTERING
ORDER
BY
( productid ASC
);
Datastax 文档显示:
Collections are meant for storing/denormalizing relatively small amount of data.
...但我不确定是什么定义了一点或很多。列表的顺序无关紧要。这些行永远不会被单独读取。所有读取均来自 Spark 并使用令牌范围读取大量数据。
如果数据永远不变,则使用列表的冻结版本,这样所有点都将存储为一个二进制对象:
vectors frozen<LIST<FLOAT>>
只有当您只需要读取一个值或类似的值时,使用单独的行才有意义。如果您总是阅读整个数据集 - 使用冻结列表。
我赞同 Alex 的建议,冻结列表比上面的非冻结列表更适合您的用例 - 但是我还要补充一些要点。
在第二个 table 示例中,规范化后没有额外的列来表示不同的列表项 - 主键保持不变,因此实际上每个主键只存储 1 个值,而不是1280 你打算。键中必须有一个额外的列才能使其成为每个列表条目的唯一行。
对于第一个 table,虽然您可以使用冻结列表 - 如果列表中的项目没有实际顺序并且没有重复,您可以选择一个更简单的集合,因为有没有存储/考虑序数位置。 (第二个 table 设计中缺少任何顺序是考虑的催化剂)
我需要在 Cassandra 中为每条记录存储多个浮点数。我当前的架构如下所示:
CREATE
TABLE
data_point
( account ASCII
, groupkey TINYINT
, productid TEXT
, vectors LIST<FLOAT>
, PRIMARY KEY ((account, groupkey), productid))
WITH CLUSTERING
ORDER
BY
( productid ASC
);
每条记录有1280个浮点数。这些行一旦插入,就永远不会更新或删除。虽然这可行,但我一直在考虑是否最好将它们放在单独的 1280 行中。
CREATE
TABLE
data_point
( account ASCII
, groupkey TINYINT
, productid TEXT
, vector FLOAT
, PRIMARY KEY ((account, groupkey), productid))
WITH CLUSTERING
ORDER
BY
( productid ASC
);
Datastax 文档显示:
Collections are meant for storing/denormalizing relatively small amount of data.
...但我不确定是什么定义了一点或很多。列表的顺序无关紧要。这些行永远不会被单独读取。所有读取均来自 Spark 并使用令牌范围读取大量数据。
如果数据永远不变,则使用列表的冻结版本,这样所有点都将存储为一个二进制对象:
vectors frozen<LIST<FLOAT>>
只有当您只需要读取一个值或类似的值时,使用单独的行才有意义。如果您总是阅读整个数据集 - 使用冻结列表。
我赞同 Alex 的建议,冻结列表比上面的非冻结列表更适合您的用例 - 但是我还要补充一些要点。
在第二个 table 示例中,规范化后没有额外的列来表示不同的列表项 - 主键保持不变,因此实际上每个主键只存储 1 个值,而不是1280 你打算。键中必须有一个额外的列才能使其成为每个列表条目的唯一行。
对于第一个 table,虽然您可以使用冻结列表 - 如果列表中的项目没有实际顺序并且没有重复,您可以选择一个更简单的集合,因为有没有存储/考虑序数位置。 (第二个 table 设计中缺少任何顺序是考虑的催化剂)