读数据库中的字段不出现在写数据库中是否正常?

时间:2019-02-11 21:33:03

标签: c# domain-driven-design cqrs

CQRS写入数据库包含与CQRS读取数据库不同的字段是否正常?例如,在上述情况下,Product.Description保留在读取端(NoSQL)而不在写入端(SQL Server)保持正常吗?

我意识到写侧选择的数据库(RDBMS)的数据结构可能不同于读侧选择的数据库(NoSQL)的数据结构。我特别在问是否“允许”选择在读取端和写入端保留哪些数据字段。

我问的原因是我正在阅读的一本书暗示这是正常现象,但是,我在书中或网上找不到任何支持此事的例子。

请参见下面的代码:

public class Product
    {
        public Guid Id { get; set; }
        public string Code { get; set; }
        public string Description { get; set; }

        public void LookupDescriptionByCode(List<ProductDescriptionLookup> productCodes)
        {
            Description = productCodes.Find(x => x.Code == Code).Description;
        }
    }

1 个答案:

答案 0 :(得分:3)

  

CQRS写入数据库包含与CQRS读取数据库不同的字段是否正常?

通常,写入数据库将是读取数据库的超集(大于)。

  

将Product.Description保留在读取侧(NoSQL)而不在写入侧(SQL Server)保留是正常的吗?

不,但是也许。

如果您想象一个带有整体式写数据库的系统,那么“记录簿”将是写数据库,并且所有内容都将存在于此;读取的数据库将只是在写入数据库中缓存信息的副本。

但是,如果您要破坏整体,读取模型可能会合并来自多个写入模型的信息。因此,写模型可能只知道产品代码,而读模型可能具有产品描述(因为它使用代码从“其他地方”查找描述)。

但是,在系统中的某处处,您可以随时获得“产品”代码的正式副本。

  

我有一个事件日志,它是记录簿。我很困惑为什么还需要一个写数据库。我可以看到将某些域对象持久保存到写数据库中的好处,但是不是全部?

如果您要进行事件来源,那么事件日志通常存储在写入数据库中(可能是RDBMS,也可能是专用消息存储)。

  

可以公平地说,如果有一个EventStore / EventLog / IntegrationLog,则不需要写数据库(每个域对象的关系表)。

我认为可以说,如果您的事件存储充当记录簿,则不需要关系表也可以 充当这些相同实体的记录簿。 / p>

例如,对于部分域(而不是全部域)使用事件源可能是有意义的。或者,您可能想缓存表示形式以提高写入效率。或者...