gpt4 book ai didi

Cassandra- UserProfilie 的数据建模

转载 作者:行者123 更新时间:2023-12-03 08:11:06 25 4
gpt4 key购买 nike

我有一个用户模型,具有如下属性:-

class User(Model):
user_id = columns.Integer(primary_key=True)
username = columns.Text()
email = columns.Text()
fname = columns.Text()
lname = columns.Text()
age = columns.Text()
state = columns.Text()
city = columns.Text()
country = columns.Text()
gender = columns.Text()
phone = columns.Text()
school_name = columns.Text()
created_at = columns.Text()
race = columns.boolean()

这是我的正常 RDBMS 模型。我的查询如下:-
1) Get all users with city = 'something'

2) Get a user with email = 'something'

3) Get a user with username = 'something'

4) Get all users with phones IN ('something' )

5) Get all users with state = 'something'

6) Get all users with age > something

7) Get all users with gender = 'something'

8) Get all users with race = 'something'

9) Get count(*),school_name users Group By schoolname

10) Get all users with created_date > 'something' LIMIT 1000

11) Get all users with username IN ('something') AND age IN ('something') AND phone IN ('something') AND state IN ('something') AND so on LIMIT 1000

我可以通过 RDBMS 中的简单 Select 查询获得上述查询结果,但问题在于 Cassandra。

因为,要在 Cassandra 中获得上述查询的结果,建议每个查询使用不同的模型,这将加快读取能力。在这个时代,磁盘比以前便宜得多。话虽这么说,我明白仅仅在问题上投入更多磁盘并不总是那么容易。我看到的更大的问题是调整应用程序的 DAO 层以保持 10 个不同的表同步。 (此外,我内心的直觉不相信有 10 个模型用于不同的查询。:P)

有人可以向我解释 Cassandra 中的正确模型以获得这些查询的结果吗?

PS:以上模型的 Action 可以是读/写/更新/删除。 查询 11 是最重要的查询。

考虑到有关特定用户的信息可以更新,最重要的是在大量数据上真正快速地进行这些查询。

最佳答案

您正面临着真正的 Cassandra 限制:如果您确定要使用 Cassandra,则需要遵循“Cassandra 规则”。其中有

  • 非规范化
  • 明智地选择索引

  • 那么让我们开始吧。每个用户都应该有唯一的 ID、用户名、电子邮件和电话。这意味着这些列不是索引 ( read here why ) 的好候选者,因此非规范化是正确的方法。

    根据您的查询,您将获得 user_by_username、user_by_email 和 user_by_phones。您可能认为每次重复数据在更新和磁盘使用方面可能很繁重:因此您可以通过创建仅包含用户 ID 作为值的每个数据进行折衷。例如:
     user_email     | user_id 
    --------------+-------------------
    some@thing.com | 123-456-7aa |
    girl@hello.org | efg-123-ghi |

    在 KS 内的另一个表中,您需要一个表,该表将通过 id 检索有关用户的所有信息。这将解决 update problem ,如果您需要更新电子邮件地址或电话,您只能更新几个表而不是 N。阴暗的一面是您必须执行两个查询才能获得数据。

    我们继续。
    stategenderrace 很适合被索引,原因如下:
  • 低基数
  • 许多行将包含这些值

  • 通过索引,您将解决一些其他查询。最难的部分是像这样的查询
    select * from users where age > xyz

    这种查询在 Cassandra 中是不允许的,因为您需要在聚类部分执行“!equals”操作。为此,您需要通过某种通用键“组织”用户:例如状态或“状态组”——这意味着要了解特定年龄的所有用户,您必须查询每个分区。

    注意:我没有提供解决方案,这也不是我的目标——我试图做的是提供一种方法来解决 Cassandra 的这个问题。

    哈,
    卡罗

    关于Cassandra- UserProfilie 的数据建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29365747/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com