代码之家  ›  专栏  ›  技术社区  ›  w0051977

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

  •  2
  • w0051977  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  3
  •   VoiceOfUnreason    7 年前

    CQRS写数据库包含到CQRS读数据库的不同字段是正常的吗?

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

    Product.Description保存在读端(NoSQL)而不是写端(SQL Server)是正常的吗?

    不,但也许。

    如果你想象一个系统有一个整体的写数据库,那么“记录簿”就是写数据库,所有的东西都会存在那里;读数据库只是写数据库中信息的缓存副本。

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

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

    我有一个事件日志,这是记录簿。我很困惑为什么还需要写数据库。我可以看到将某些域对象持久化到write数据库的好处,但是不是所有这些对象都是这样吗?

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

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

    我认为,如果您的事件存储充当记录簿,那么您不需要关系表来 作为这些实体的记录簿。

    例如,您可以对部分域(而不是全部域)使用事件源。或者您可能希望缓存表示以提高写入效率。或者。。。

    推荐文章