Database design Cassandra中按名称检索用户的建模数据
我正在处理一个使用Cassandra作为主数据库的项目,其“users”表如下所示: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 ) 我的应用程序需要通过分页来执行查询列表所有用户按名称排序,我正在努力设计表以满足这一要求 那么,在这种情况下,设计“用户-订单-按名称”的好方法是
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