首页 > 解决方案 > 数据库设计 - 需要帮助扩展查询

问题描述

我正在尝试为以下请求找到最佳的数据结构/数据存储解决方案(最高性能):

我有一个需要为美国所有个人存储的属性列表,例如:

+------------+-------+-------------+
| 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

但是您可以猜到,对于具有数百万行的数据库......不是高性能的。

谢谢!

标签: databasedesign-patternsdatabase-designnosqlamazon-dynamodb

解决方案


如果数据存储不是约束,我会使用 DocumentDB,比如 MongoDB、CosmosDB 甚至 ElasticSearch。

例如,使用 Mongo,您可以利用它的无模式特性,并拥有一个具有每个“属性”一个属性的 People 集合:

{
  "SSN": "123-45-6789",
  "eyeColor": "brown",
  "hairColor" "blond",
  "sex": "M"
}

此集合中的文档可能具有不同的属性,但这不是问题。您现在所要做的就是在每个索引上放置一个索引并运行您的查询。


推荐阅读