【问题标题】:Can I support both Nhibernate and RavenDb at the same time?我可以同时支持 Nhibernate 和 RavenDb 吗?
【发布时间】:2013-01-09 18:03:06
【问题描述】:

我正在开发一个已经在 Nhibernate 上运行的应用程序,但我正在考虑使用 RavenDb 来处理一些我发现很难在关系数据库上实现的用例。 (例如,不使用 EAV 的动态字段)

我已经阅读了 Ayende 在this post 上推荐的关于该主题的这篇文章。我不确定从长远来看这是否可行,以及为了获得应用程序的动态字段而必须支持 2 个数据库存在哪些常见缺陷。

【问题讨论】:

  • 这些动态字段是否可查询?如果是这样,那就改变了要求。
  • @JosephDaigle +1 非常相关的问题。 Jonn,在确定一种方法之前,请多考虑一下您希望在存储这些数据后如何处理这些数据。如果您想进行复杂的查询,EAV(或其变体)可能会过度规范化。您可能必须对“瘦”表进行多次连接才能执行复杂的查询。完全动态化是绝对必要的(在您的要求中)吗?不过有趣的问题。我之前没有看过关于休眠/动态存储的 Ayende 帖子。
  • 在一定程度上应该是可查询的。该数据不会用于任何域逻辑,但可能会用于报告目的。我们必须想出一些动态的东西。这是 EAV 试图解决的常见“我们不知道每个客户需要哪些其他字段,因此我们希望他们能够自行输入他们想要的内容”。虽然 EAV 有很多陷阱,但这次我什至不想尝试。

标签: nhibernate ravendb


【解决方案1】:

在来自 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 的)。

【讨论】:

  • 嗯,是的。如果被推荐的话,我希望分布式事务不会像 EAV 设计那样可怕。走序列化路径,这是否意味着我必须将自定义字段限制为 SQL 可以支持的最大大小(例如 8000 个字符)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多