如何在关键值存储中存储相关的业务模型对象?

时间:2018-03-12 16:36:03

标签: database-normalization key-value-store

假设此模型和键值存储支持获取整个对象而不仅仅是标量类型:

class Country
{
    public string Name { get; set; }
}

class Company
{
    public string Key { get; set; }
    public string Name { get; set; }
    public Country Country { get; set; }
}

var bmw = new Company
{
    Key = "bmw",
    Name = "Bayerische Motoren Werke",
    Country = new Country { Name = "Germany" }
};
var vw = new Company
{
    Key = "vw",
    Name = "Volkswagen",
    Country = new Country { Name = "Germany" }
};

myStore.Put(bmw.Key, bmw);
myStore.Put(vw.Key, vw);

问题:

  1. 如果没有冗余数据,我如何处理公司与国家之间的关系?
  2. Company.Key:将密钥存储在值中是否是个好主意?从技术上讲,这是多余的,因此“糟糕”。但是在多层应用程序中传递“公司”之后,我可能需要记住相关的密钥。

1 个答案:

答案 0 :(得分:0)

考虑下面的键/值对示例 - 使用数字标识符,但是有意义的,标准体分配的主键:

Country.de.Name=Germany
Company.1.Name=BMW
Company.1.Country=de
Company.2.Name=VW
Company.2.Country=de

这有意义地按照尊重国家标准化:架构设计使得国家/地区名称只存储一次,只能存储一次(防止任何可能存在冲突的数据)。

"完整性检查"和"外键"与规范化无关的概念;那么说,我会注意到一些元组存储(其中键/值存储实际上是一个简并子集)确实支持约束执行;例如,在Datomic中,这是通过交易功能实现的。

同样,Redis可以在服务器端运行任意Lua代码,这是应用程序可用于约束实施的功能。 简而言之:可以对键/值存储中的内容进行有意义的规范化。