Database design 如何在最终一致的数据库上实现列表?

Database design 如何在最终一致的数据库上实现列表?,database-design,list,nosql,Database Design,List,Nosql,我希望通过Cassandra、Riak或任何其他最终一致的存储实现列表和队列。这可能吗?我该怎么做 我正在寻找一种通用算法。我不完全理解。什么列表/队列?您可以创建一个(一个/多个)文档,其中包含每个队列/列表。你是说查询之类的(听起来有点像SQL思维) 在这里可以找到一篇关于建模和不建模的非常好的文章: 怎么不做呢 怎么做 如果我理解错了,请澄清:)我不完全理解。什么列表/队列?您可以创建一个(一个/多个)文档,其中包含每个队列/列表。你是说查询之类的(听起来有点像SQL思维) 在这里可以

我希望通过Cassandra、Riak或任何其他最终一致的存储实现列表和队列。这可能吗?我该怎么做


我正在寻找一种通用算法。

我不完全理解。什么列表/队列?您可以创建一个(一个/多个)文档,其中包含每个队列/列表。你是说查询之类的(听起来有点像SQL思维)

在这里可以找到一篇关于建模和不建模的非常好的文章:

怎么不做呢

怎么做


如果我理解错了,请澄清:)

我不完全理解。什么列表/队列?您可以创建一个(一个/多个)文档,其中包含每个队列/列表。你是说查询之类的(听起来有点像SQL思维)

在这里可以找到一篇关于建模和不建模的非常好的文章:

怎么不做呢

怎么做


如果我理解错了,请澄清:)

你可以走另一条路,使用Lucene存储你的“列表”,只需在Lucene中添加一列作为“对话索引”或你正在做的任何事情


有关更多信息,请参见项目。另外,有一个很好的书写方式。

你可以选择另一种方式,使用Lucene存储你的“列表”,只需在Lucene中添加一列作为“对话索引”或你正在做的任何事情

有关更多信息,请参见项目。此外,还有一个很好的书面说明。

免责声明:我对卡桑德拉或里亚克并不特别熟悉。这适用于一般的“数据库”(不一定是关系数据库、分布式数据库等)

我假设您能够存储和访问“键值对”(即一对值(a,b),其中a是值b的键)

我还将使用此符号来表示一些广义的“对象”(数据结构、对象、字典等):Person[姓名:“John Doe”年龄:49]

实施链表 假设您有一个键值对(key,value)和一个对象[fields:values…],则可以通过以下方式在数据库中实现链表:

  • 通过定义对象[字段:值…下一个]或
  • 创建一个新的“持有者对象”,定义为(键,值)=持有者[对象[字段:值…]下一步]
  • 也可以将链表的第一个值存储在一些特殊的键值对中,如(first,…)

    无论哪种情况,都可以在数据库中实现链表

    从键值对中提取值时,要获取下一个值,只需找到持有者或对象的“下一个”字段,即可遍历列表到下一个值,以此类推

    链表算法示例

    搜索:

    def find(first, node):
        if node = first[next]:
            return first[next]
        else:
            find(first[next], node)
    
    搜索前任:

    def find_pred(first, node):
        if node = first[next]:
            return first
        else:
            find_pred(first[next], node)
    
    在特定节点之前插入:

    def insert_at_front(node, inserted_node):
        find_pred(node)[next] = inserted_node
        inserted_node[next] = node
    
    队列的实现 在这种情况下,队列可以是一个链表,其中自动知道两个特定值(可能存储在数据库中):

  • 可以与特殊键值对(head,…)一起存储的第一个元素(或head)
  • 可以与特殊键值对(tail,…)一起存储的最后一个元素(或tail)
  • 注意:这些算法是特意简化的;它们不是用任何特定的语言编写的,不处理异常、列表末尾等,不应该用于诸如此类的东西。。。。等等。

    免责声明:我对卡桑德拉或里亚克并不特别熟悉。这适用于一般的“数据库”(不一定是关系数据库、分布式数据库等)

    我假设您能够存储和访问“键值对”(即一对值(a,b),其中a是值b的键)

    我还将使用此符号来表示一些广义的“对象”(数据结构、对象、字典等):Person[姓名:“John Doe”年龄:49]

    实施链表 假设您有一个键值对(key,value)和一个对象[fields:values…],则可以通过以下方式在数据库中实现链表:

  • 通过定义对象[字段:值…下一个]或
  • 创建一个新的“持有者对象”,定义为(键,值)=持有者[对象[字段:值…]下一步]
  • 也可以将链表的第一个值存储在一些特殊的键值对中,如(first,…)

    无论哪种情况,都可以在数据库中实现链表

    从键值对中提取值时,要获取下一个值,只需找到持有者或对象的“下一个”字段,即可遍历列表到下一个值,以此类推

    链表算法示例

    搜索:

    def find(first, node):
        if node = first[next]:
            return first[next]
        else:
            find(first[next], node)
    
    搜索前任:

    def find_pred(first, node):
        if node = first[next]:
            return first
        else:
            find_pred(first[next], node)
    
    在特定节点之前插入:

    def insert_at_front(node, inserted_node):
        find_pred(node)[next] = inserted_node
        inserted_node[next] = node
    
    队列的实现 在这种情况下,队列可以是一个链表,其中自动知道两个特定值(可能存储在数据库中):

  • 可以与特殊键值对(head,…)一起存储的第一个元素(或head)
  • 可以与特殊键值对(tail,…)一起存储的最后一个元素(或tail)

  • 注意:这些算法是特意简化的;它们不是用任何特定的语言编写的,不处理异常、列表末尾等,不应该用于诸如此类的东西。。。。等等。

    看看笼子项目。它可能对您的用例有帮助。


    它基本上使用ZooKeeper集群进行锁定,以便数据具有逻辑一致性。当您的应用程序想要修改列表时,可以持有锁,以便其他用户不会同时修改列表

    看一看Cages项目。它可能对您的用例有帮助。

    它基本上使用ZooKeeper集群进行锁定,以便数据具有逻辑一致性。当您的应用程序想要修改列表时,它可以持有一个锁,这样它就不会被其他用户修改