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;
}
}
答案 0 :(得分:3)
CQRS写入数据库包含与CQRS读取数据库不同的字段是否正常?
通常,写入数据库将是读取数据库的超集(大于)。
将Product.Description保留在读取侧(NoSQL)而不在写入侧(SQL Server)保留是正常的吗?
不,但是也许。
如果您想象一个带有整体式写数据库的系统,那么“记录簿”将是写数据库,并且所有内容都将存在于此;读取的数据库将只是在写入数据库中缓存信息的副本。
但是,如果您要破坏整体,读取模型可能会合并来自多个写入模型的信息。因此,写模型可能只知道产品代码,而读模型可能具有产品描述(因为它使用代码从“其他地方”查找描述)。
但是,在系统中的某处处,您可以随时获得“产品”代码的正式副本。
我有一个事件日志,它是记录簿。我很困惑为什么还需要一个写数据库。我可以看到将某些域对象持久保存到写数据库中的好处,但是不是全部?
如果您要进行事件来源,那么事件日志通常存储在写入数据库中(可能是RDBMS,也可能是专用消息存储)。
可以公平地说,如果有一个EventStore / EventLog / IntegrationLog,则不需要写数据库(每个域对象的关系表)。
我认为可以说,如果您的事件存储充当记录簿,则不需要关系表也可以 充当这些相同实体的记录簿。 / p>
例如,对于部分域(而不是全部域)使用事件源可能是有意义的。或者,您可能想缓存表示形式以提高写入效率。或者...