我正在寻找如何创建一个有效的模型来满足我在下面提出的要求。我曾尝试使用 gcloud-node,但注意到它在读取一致性、引用等方面存在限制。我更愿意将其编写为 nodejs,但只要它可以改进我的模型,就可以使用 java 或 python 编写。我正在围绕将于 7 月 1 日推出的新定价模式进行构建。
我的应用程序包含一个封闭的电子邮件系统。本质上,发生的事情是用户注册到该站点。这些用户可以交朋友。然后他们可以互相发送电子邮件。
应用程序的组件:
用户 - 无限数量的用户可以加入。
好友 - 一个用户可以拥有 200 个已确认好友和 100 个待处理好友请求。检索好友列表时,它应该显示好友的姓名。(我还需要接收朋友的 ID,以便我可以在客户端使用它来创建电子邮件)。
电子邮件 - 用户可以向他们的朋友发送电子邮件,也可以接收来自朋友的电子邮件。然后,用户可以独立查看所有已发送的电子邮件(发件箱)和所有收到的电子邮件(收件箱)。他们还可以按最新查看自己和朋友订单之间发送的电子邮件。电子邮件应显示发件人和收件人姓名。阅读电子邮件后,需要将其标记为已读。
我的模型看起来像这样,但正如您所见,它们效率低下。
数据存储种类:
USER
-email (id) //The email doesn't need to be the id, but I need to be able to retrieve users by their email
-hash_password
-name
-account_status
-created_date
FRIEND
-id (auto-generated)
-friend1
-friend2
-status
EMAIL
-id (auto-generated)
-from
-to
-mutual_id
-message
-created_date
-has_seen
申请程序:
注册- 获取操作以查看是否存在使用此电子邮件的用户。如果不插入密钥。
登录- 获取基于电子邮件获取用户的操作。如果存在,则从实体中检索 hash_password 并与用户的输入进行比较。
发送好友请求- 好友数据将为每个关系写入两次。然后使用friend1上的索引和status上的索引,我将查询所有朋友的用户并仅过滤那些“待定”的朋友。然后我将计算这些朋友,看看他们是否超过 X。我将为其他用户再次执行此操作。如果他们都没有超过挂起的限制,我将插入好友请求。这需要在事务中运行。
接受好友请求- 好友数据将为每个关系写入两次。然后使用friend1 上的索引和status 上的索引,我将查询一个用户的所有朋友并仅过滤那些未决的朋友。然后我将计算这些朋友,看看他们是否超过 X。我将为其他用户再次执行此操作。如果它们都没有超过挂起的限制,我会将两个实体的状态更改为接受为交易。
显示已确认的好友- 好友数据将为每个关系写入两次。然后使用friend1上的索引和status上的索引,我将查询所有朋友的用户并仅过滤那些被接受的朋友。不知道我将如何显示朋友的名字(例如,如果用户更改了他们的名字会发生什么,这需要反映在所有朋友关系和电子邮件中!)。
显示待处理的朋友- 朋友数据将为每个关系写入两次。然后使用friend1 上的索引和status 上的索引,我将查询一个用户的所有朋友并仅过滤那些未决的朋友。不知道我将如何显示朋友的名字(例如,如果用户更改了他们的名字会发生什么,这需要反映在所有朋友关系和电子邮件中!)。
查看已发送的电子邮件- 使用 from 属性上的索引,我将查询以按 created_date 排序的时间(最新的优先)一次从用户 5 获取所有已发送的电子邮件。(例如,如果用户更改了他们的名字会发生什么,这需要反映在所有的朋友关系和电子邮件中!)。
查看收到的电子邮件- 使用 to 属性上的索引,我将查询一次将所有收到的电子邮件发送给用户 5,按 created_date 排序(最新的优先)。当看到一封电子邮件时,它会将实体 has_seen 属性更新为 true。(例如,如果用户更改了他们的名字会发生什么,这需要反映在所有的朋友关系和电子邮件中!)。
查看 2 个用户之间的电子邮件- 使用基于 [lower_lexicographic_email]:[higher_lexicographic_email] 的mutual_id 上的索引来查询相互电子邮件。按最新订购,一次 5 个。(例如,如果用户更改了他们的名字会发生什么,这需要反映在所有的朋友关系和电子邮件中!)。
创建电子邮件- 使用friend1 和状态索引我将确认用户是朋友。如果他们是朋友,我会插入一封电子邮件。