如何以最少的重复将翻译存储在 nosql DB 中?

How to store translations in nosql DB with minimal duplication?

我在 DynamoDB 中得到了这个模式

{
"timestamp" : "",
"fruit" : {
    "name" : "orange",
    "translations" : [
        { 
            "en-GB" : "orange" 
        },
        {
            "sv-SE" : "apelsin"
        },
        ....
    ]
}

我需要将对象的翻译存储在 DynamoDB 数据库中,以便能够高效地查询它们。例如。我的查询必须类似于 "give me all objects where translations array contains "

问题是,这个想法真的很愚蠢吗?那里有 6500 种语言,这意味着我将强制所有条目都包含一个数组,其中包含数千个属性,其中 99% 为空字符串值。什么是更好的方法? 谢谢,

我宁愿另存为。

{
"primaryKey" : "orange",
"SecondaryKey": "en-GB"
"timestamp" : "",
"Metadata" : {
    "name" : "orange",

}

并创建二级索引,SecondaryKey为PK,primaryKey为SK。

通过这样做你可以查询

  1. 给我 en-GB 的橙色。

  2. en-GB 中存在的所有密钥


如果您一次更新多个项目。您可以像这样创建 1 个对象

{
"KeyName" : "orange",
"SecondaryKey": "master"
"timestamp" : "",
"fruit" : {
    "name" : "orange",
    "translations" : [
        { 
            "en-GB" : "orange" 
        },
        {
            "sv-SE" : "apelsin"
        },
        ....
    ]
}

并创建一个 lambda 函数,该函数对上述对象进行非规范化并在 dynamodb 中创建多个实体。但是您也必须设法删除元素。如果在新对象中没有某种语言。

除非您愿意让 DynamoDB 进行 table 扫描以获得结果,否则我认为您使用了错误的工具。考虑通过 Firehose 之类的东西将您的交易流式传输到 AWS ElasticSearch。 Firehose 会给你很多好处,可以帮助你轮换事务索引。 ElasticSearch 应该能够存储该结构和 运行 您的查询。

如果您不走那条路,那么至少考虑在您的结构中删除语言代码(如果您实际上没有使用它的话)。只需制作一系列水果的独特拼写。这是我可能会尝试使用多个查询而不是单个查询来执行的查询;从水果名称的拼写到您可以查询的水果 UUID。