1

有人可以指点我在这里发布/pdf/explan,在那里我可以了解更多关于超表数据库设计的信息,我在谷歌上搜索过,但没有任何有用的东西出现

我遇到的主要问题是如何存储您“不能”表示为键值的数据。例如,假设我想跟踪用户评论,我可以简单地模仿关系数据库,生成新的评论密钥存储我需要的所有数据,然后对于产品 X 将所有评论的密钥以 json 格式存储到 x.reviews

我想出的另一件事是简单地使用 x.reviewKeys,然后为每个生成的评论推送新密钥作为该单元格的新版本,假设我可以存储同一单元格的无限数量的版本。

第二种方法对我来说似乎更合适,因为我将在代码中实现的所有工作都留给数据库。

有谁知道如何处理这个问题,或者更好的是谷歌如何用他们的 bigtable 处理这个问题

4

2 回答 2

0

这“几个小时”搜索任何可能导致理解 Hypertable 数据库设计的东西绝对是不够的,但如果有人通过谷歌跑到这里,这就是起点

现在据我所知,你可以定义列族,说,reviews每个列族可以有无限数量的键,例如,如果你尝试存储用户数据,你可能会写这样的东西

userKey:info并具有多个属性,例如name, address, email...您只需定义该条目的键即可访问该信息,例如获取address您将userKey:info:address用作键的用户

使列族不同的一件事(如果我理解得很好)是您可以获得列族中的所有键,例如,如果您指定userKey:info您将获得userKey:info:name, userKey:info:address, userKey:info:email结果,这意味着存储我在问题中提到的所有评论您将创建新的列族并存储所有评论的键,最终会得到类似这样的东西key:reviews:<review_ID>,它将返回所有评论的 ID(如果您要求它返回键:评论),而不是简单地使用该 ID 来获取详细信息关于具体审查。

所以基本上就像您在列族信息中有属性名称、地址、电子邮件一样,在这里您将使用评论 ID 作为列属性。

现在至少部分确定我做对了,我还检查了 riak 数据库设计(键/值数据库与列数据库的超表不同?)并且似乎他们有桶作为列族的替代品,所以这至少似乎是正确执行

我不知道他们如何在内部实现这一点以使其高效,所以我必须检查一下,因为我总是在上面创建新帐户,所以我将无法更新这篇文章,但如果有人有更多信息发布重播/编辑这篇文章

于 2012-07-14T13:51:55.337 回答
0

因此,如果我理解正确,您有一个包含产品的表和另一个包含评论的表,它们有 1:n 的关系(每个产品可以有多个评论)?

一种方法是使用列限定符。

您的产品表有一个行键(即产品 ID),一些列标题、描述、制造商等。还有一列“评论”:

create table Products (title, description, manufacturer, reviews);

对于评论,您可以创建一个唯一键,即行键的 GUID(或足够大的随机数或唯一时间戳;我将在我的示例中使用 GUID):

create table Reviews (author, rating, text);

要创建 1:n 关系,请将评论的行键插入“评论”列族作为限定符(不需要实际的单元格值,可以为空):

INSERT INTO Reviews VALUES ("product-id", "reviews:1273-1234-234-123a", "");

并检索产品 123 的所有评论:

SELECT reviews FROM Products WHERE ROW = "123";

您甚至可以在“评论”上创建限定词索引以加快某些查询。

于 2012-07-15T11:58:30.460 回答