database - 数据库设计 - 需要帮助扩展查询
问题描述
我正在尝试为以下请求找到最佳的数据结构/数据存储解决方案(最高性能):
我有一个需要为美国所有个人存储的属性列表,例如:
+------------+-------+-------------+
| Attribute | Value | SSN |
+------------+-------+-------------+
| hair color | black | 123-45-6789 |
| eye color | brown | 123-45-6789 |
| height | 175 | 123-45-6789 |
| sex | M | 123-45-6789 |
| shoe size | 42 | 123-45-6789 |
正如您可以猜到的那样,对于普通人群,这些属性没有什么独特和可识别的。但是,让我们假设如果我们要从 3 或 4 个属性的组合中获取,那么我将能够唯一标识一个人(找到他们的 SSN)。
现在困难在于,能够唯一识别一个人的组合将随着时间的推移而发展并进行调整。
在上述场景中存储和查询数据的最佳选择是什么,并且在规模上保持高性能(<100ms)?
当前尝试结合两个属性:
SELECT * FROM (SELECT * FROM people WHERE hair='black') p1
JOIN (SELECT * FROM people WHERE height=175) p2
ON p1.SSN = p2.SSN
但是您可以猜到,对于具有数百万行的数据库......不是高性能的。
谢谢!
解决方案
如果数据存储不是约束,我会使用 DocumentDB,比如 MongoDB、CosmosDB 甚至 ElasticSearch。
例如,使用 Mongo,您可以利用它的无模式特性,并拥有一个具有每个“属性”一个属性的 People 集合:
{
"SSN": "123-45-6789",
"eyeColor": "brown",
"hairColor" "blond",
"sex": "M"
}
此集合中的文档可能具有不同的属性,但这不是问题。您现在所要做的就是在每个索引上放置一个索引并运行您的查询。
推荐阅读
- ios - 苹果支付在本地移动应用程序上是强制性的吗?
- php - 如何在 Laravel 中的特定时间插入表数据?
- google-cloud-platform - 用于在 GCP 中创建项目的 Google API 最初有效,然后它们不再有效
- c# - 写一些东西在一个使用 selenium c# 在 html 中标记不起作用
- ubuntu - 如何在编译 Minotaur 时找出 cmake 错误?
- ios - 仅在 Safari 浏览器中打开 url 而不是默认浏览器
- linear-regression - 标称属性“标签编码为 1、2、3”我可以直接用于没有假人的随机森林算法
- javascript - 将 *.gql 文件中的 2 个查询合并为 1 个查询
- node.js - 使用移动应用程序或二维码进行用户认证/授权
- reactjs - 向 React JS 项目添加动态状态