0

我已经做了一些谷歌搜索,但我还没有找到解决方案,甚至没有找到我的问题的明确答案。

问题很简单。我想为动态命名/创建的对象的每个实例动态创建一个表。然后每个表将包含特定于对象的记录。我知道这本质上是一种反模式,但这些表理论上可能会变得非常大,因此将所有数据放在一个表中可能会导致性能问题。

一个更具体的例子:

我有一个包含事务集合的基类/接口 ACCOUNT。对于使用我的软件的每家公司,我都会创建一个新的具体版本的类,BOBS_SUB_SHOP_ACCOUNT 或 SAMS_GARAGE_ACCOUNT 等。所以类的标识值是类名,而不是类中的字段。

我正在使用 C# 和 Fluent nHibernate。

所以我的问题是:

  1. 这有意义还是我需要澄清更多?(或者我是否正在尝试做一些我真的不应该做的事情?)
  2. 这种模式有名字吗?
  3. nHibernate 支持这个吗?
  4. 您知道我可以阅读的有关该模式的任何文档吗?

编辑:我想了更多,我意识到我真的不需要动态对象。我所需要的只是一种通过 NHibernate 将具有某些标识符的对象绑定到表的方法。例如:

//begin - just a brain dump
public class Account
{
  public virtual string AccountName { get; set; }
  public virtual IList Stuff { get; set; }
}

... somewhere else in code ...

//gets mapped to a table BobsGarageAccount (or something similar)
var BobsGarage = new Account{AccountName="BobsGarage"}; 
//gets mapped to a table StevesSubShop(or something similar)
var StevesSubShop = new Account{AccountName="StevesSubShop"};
//end

这应该足以满足我的需要,假设 NHibernate 允许它。我试图避免这样一种情况,即如果帐户表上出现大量交易,一张巨大的表就会被击败。如果所有帐户都在一张桌子上……那可能很难看。

先感谢您。

4

2 回答 2

1

我会推荐一个动态对象,而不是动态创建一个类。如果你实现了正确的接口(一个例子是here,无论如何你都可以通过继承来DynamicObject实现),你可以写

dynamic bobsSubShopAccount = new DynamicAccount("BOBS_SUB_SHOP_ACCOUNT");
Console.WriteLine("Balance = {0}", bobsSubShopAccount.Balance);

在您的客户端代码中。如果您使用 DLR 来实现DynamicAccount,所有这些调用都会在运行时被拦截并在运行时传递给您的类。所以,你可以有这个方法

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
    if (DatabaseConnection.TryGetField(binder.Name, out result))
        return true;

    // Log the database failure here

    result = null;
    return false; // The attempt to get the member fails at runtime
}

使用客户端代码请求的成员名称从数据库中读取数据。

我没有使用过 NHibernate,所以我不能以任何权威评论 NHibernate 将如何使用动态对象。

于 2012-02-09T23:01:41.580 回答
0

这些类对我来说似乎很臭,并试图解决实际的存储层问题,而不是域问题。从本质上讲,分片是您正在寻找的术语。

如果您真的担心数据库的性能,并且您的负载会很大,也许您可​​能会考虑对表进行分区?您的域对象可以轻松地处理创建分区键,并且您不必对 NHibernate 进行疯狂的巫术。如果您以后更改持久性机制,这也将更容易地允许您不做疯狂的域级别的事情。您可以在地图中创建集合过滤器,或将只读对象映射到视图。不过,后一种选择在域中会有点臭。

如果你绝对坚持做一些巫术,你可能想看看 NHibernate.Shards,它是为方便数据库分片而设计的。我不能说当前的开发状态和兼容性是什么,但它是一个选项。

于 2012-02-10T03:17:58.763 回答