我正在开发一个已经在Nhibernate上运行的应用程序,但我正在考虑使用RavenDb来处理一些我发现很难在关系数据库上实现的用例。 (例如,不使用EAV的动态字段)
我已经阅读了Ayende在this post上就此主题推荐的内容。我不确定从长远来看这是否实用,以及为了获得应用程序的动态字段而必须支持2个数据库的常见缺陷。
答案 0 :(得分:3)
在Ayende的链接中,他并不主张拥有两个数据库。仅仅是模式将被扩展以允许关于实体的附加元数据存储在单独的表中。如果你正在讨论混合模式DA层,其中部件将进入NHibernate而部件将部署到RavenDB,那么你可能会进入分布式事务领域 - 这可能会大大增加你的范围。
您还可以考虑在实体表中添加一个额外的列,以允许您将对象序列化为它 - 例如它可以是字典(您甚至可以使用Json)。如果您之后不需要在多个实体中查询,那么这将是您的选择。如果您在查看特定实体时只需要该数据,那么您就可以了。
我已经使用这种方法来存储用户的偏好。我不需要'找到其偏好类别X具有值Y'的所有用户,我只需要说'告诉我用户A的所有偏好的所有值'。
编辑 - 存储XML
对于数据库中的序列化对象,您可以使用xml数据类型。来自msdn的链接如下: -
Implementing XML in SQL Server
这可以达到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的。)