Database design Cassandra中按名称检索用户的建模数据

Database design Cassandra中按名称检索用户的建模数据,database-design,cassandra,Database Design,Cassandra,我正在处理一个使用Cassandra作为主数据库的项目,其“users”表如下所示: CREATE TABLE users ( id uuid PRIMARY KEY, name text, address text, email text, password text, website text ) 我的应用程序需要通过分页来执行查询列表所有用户按名称排序,我正在努力设计表以满足这一要求 那么,在这种情况下,设计“用户-订单-按名称”的好方法是

我正在处理一个使用Cassandra作为主数据库的项目,其“users”表如下所示:

CREATE TABLE users (
    id uuid PRIMARY KEY,
    name text,
    address text,
    email text,
    password text,
    website text
)
我的应用程序需要通过分页来执行查询列表所有用户按名称排序,我正在努力设计表以满足这一要求

那么,在这种情况下,设计“用户-订单-按名称”的好方法是什么

谢谢

更新: 我的问题是关于设计表以获得排序查询,分页部分不是我关心的


我知道集群键可以用于在分区内获得排序结果。但是如果我使用“name”作为集群键。我应该使用什么作为分区键?

分页是在驱动程序级别实现的,大多数驱动程序都支持它

关于排序-在“表”上实现它有一个问题。您可以使用集群键,因此所有数据都将在分区级别(在您的示例中为id)按此键排序


因此,您必须以某种方式对分区进行排序,例如,使名称的第一个字母成为分区键,或者在客户端进行所有排序。

分页是在驱动程序级别实现的,大多数驱动程序都支持分页

关于排序-在“表”上实现它有一个问题。您可以使用集群键,因此所有数据都将在分区级别(在您的示例中为id)按此键排序

所以,您必须以某种方式对分区进行排序,例如,使名称的第一个字母成为分区键,或者在客户端进行所有排序

  • 你用什么编程语言?您可以依靠内置驱动程序分页(例如,请参阅)。
  • 您可以使用磁盘上的排序,另请参阅
    因此,您只需在创建表DDL中按(名称)添加

    如果您想使用分区键,那么也应该考虑它
  • 你用什么编程语言?您可以依靠内置驱动程序分页(例如,请参阅)。
  • 您可以使用磁盘上的排序,另请参阅
    因此,您只需在创建表DDL中按(名称)添加

    如果您想使用分区键,那么也应该考虑它


  • 我使用golang,但我的问题是语言不可知,更多的是关于表的设计。我知道我可以通过集群键进行订购。但这意味着我必须将所有用户存储到一个分区中,我认为这是一种反模式。仅仅将名称添加为集群密钥是不够的。查询只能为每个分区键生成排序结果。因此,如果分区键是
    id
    ,检索按名称排序的所有用户将不起作用。关于语言的问题意味着驱动程序支持分页。然而,我没有与戈朗的经验。至于分区,您将有多少用户@拉尔夫,我想我们可以使用单个分区。如果我们有更多关于用例的信息,分区可以自然定义。假设,我们总是希望得到的不是所有用户,而是与某个网站相关的用户子集。因此,我们可以按网站添加分区。您可以使
    name
    成为分区键并使用字节顺序分区器。但是使用这个分区器是非常困难的。如果您有足够少的用户使“列出所有”用例变得有用,那么您可以按照@S.Stas的建议使用单个分区。如果你有那么多的用户需要分发,那么“列出所有”用例就不是真正可行的,我会说。我使用golang,但我这里的问题是语言不可知,更多的是关于表设计。我知道我可以通过集群键进行订购。但这意味着我必须将所有用户存储到一个分区中,我认为这是一种反模式。仅仅将名称添加为集群密钥是不够的。查询只能为每个分区键生成排序结果。因此,如果分区键是
    id
    ,检索按名称排序的所有用户将不起作用。关于语言的问题意味着驱动程序支持分页。然而,我没有与戈朗的经验。至于分区,您将有多少用户@拉尔夫,我想我们可以使用单个分区。如果我们有更多关于用例的信息,分区可以自然定义。假设,我们总是希望得到的不是所有用户,而是与某个网站相关的用户子集。因此,我们可以按网站添加分区。您可以使
    name
    成为分区键并使用字节顺序分区器。但是使用这个分区器是非常困难的。如果您有足够少的用户使“列出所有”用例变得有用,那么您可以按照@S.Stas的建议使用单个分区。如果你有那么多的用户需要分发,那么我认为“列出所有”用例是不可行的。我已经考虑过使用第一个字母作为分区键了。但我认为这将导致数据分布不均。这是坏的根据。当然。但是你试图用卡桑德拉做一些事情,它不是按满桌排序的。如果您可以按其他方式(基于您的查询)对数据进行分区,请执行此操作,并添加名称作为群集键。@Yoshi upvoted。将用户名的第一个字母设置为分区键,将用户名设置为集群键可能会节省时间。如果您有许多用户的姓名以同一个字母开头,请选择前两个字母,或另一个“候选者”,例如用户电子邮件地址的后缀(例如“.com”、“.it”等),或诸如此类,但在这种情况下,您将失去“本机”排序是因为一旦得到所有结果,您就需要在客户端进行排序。@使用前几个字母的xmas79是我的最佳解决方案now@Yoshi在我看来,最合适的方式是将其作为一个答案发布,因为这是一个答案:)我已经考虑过使用第一个字母作为分区键。但我认为这将导致数据分布不均。这是坏的根据。当然。但是你试图用卡桑德拉做一些事情,它不是按满桌排序的。如果您可以按其他方式(基于您的查询)对数据进行分区,请执行此操作,并添加名称作为群集键。@Yoshi upvoted。制造t