我正在开发一个已经在 Nhibernate 上运行的应用程序,但我正在考虑使用 RavenDb 来处理一些我发现很难在关系数据库上实现的用例。(例如不使用 EAV 的动态字段)
我已经阅读了 Ayende 在这篇文章中推荐的这篇文章。我不确定从长远来看这是否可行,以及为了获得我的应用程序的动态字段而必须支持 2 个数据库有哪些常见的陷阱。
我正在开发一个已经在 Nhibernate 上运行的应用程序,但我正在考虑使用 RavenDb 来处理一些我发现很难在关系数据库上实现的用例。(例如不使用 EAV 的动态字段)
我已经阅读了 Ayende 在这篇文章中推荐的这篇文章。我不确定从长远来看这是否可行,以及为了获得我的应用程序的动态字段而必须支持 2 个数据库有哪些常见的陷阱。
在来自 Ayende 的链接中,他并不主张拥有两个数据库。只是模式将被扩展以允许将有关实体的其他元数据存储在单独的表中。如果您正在谈论拥有一个混合模式 DA 层,其中部分进入 NHibernate,部分进入 RavenDB,那么您可能会进入分布式事务领域 - 这可能会显着增加您的范围。
您还可以考虑在您的实体表中添加一个附加列,以允许您将一个对象序列化到其中 - 例如它可以是一个字典(您甚至可以使用 Json)。如果您之后不需要跨多个实体进行查询,这对您来说没问题。如果您只在查看特定实体时需要该数据,那您就可以了。
我已经使用这种方法来存储用户的偏好。我不需要“找到偏好类别 X 具有值 Y 的所有用户”,我只需要说“告诉我用户 A 的所有偏好的所有值”。
编辑 - 存储 XML
对于数据库中的序列化对象,您可以使用 xml 数据类型。下面来自 msdn 的链接:-
在 SQL Server 中实现 XML
这可以达到 2GB,因此您不应该用完空间来存储大量动态值。该字段的流畅映射如下所示:-
Map(x=>x.FieldForSerializedThing).CustomType("StringClob")
.Column("[FieldForSerializedThing]")
.Not.Nullable()
.Access.CamelCaseField(Prefix.Underscore);
该实体将具有这样的字段:-
public virtual System.String FieldForSerializedThing
{
get { return _fieldForSerializedThing; }
set { _fieldForSerializedThing = value; }
}
我确信还有其他方法可以进行序列化,但这可能会让你摆脱困境(顺便说一下,上面的示例是针对 SQL Server 的)。