与对象的多对多关系,其中存在中间字段?

Posted

技术标签:

【中文标题】与对象的多对多关系,其中存在中间字段?【英文标题】:Many-to-many relationships with objects, where intermediate fields exist? 【发布时间】:2012-08-18 15:19:11 【问题描述】:

我正在尝试在我的工作场所构建服务器和应用程序的模型。一台服务器可以托管许多应用程序。一个应用程序可以托管在多台服务器上。

通常我只会让主机类包含一个列表,而应用程序类包含一个列表。但是,有一些特定于特定主机-应用程序关系的字段。例如,UsedMb 表示主机上的应用程序使用的磁盘空间量。

当然,我可以有一个 HostedApplication 类来表示一个包含 UsedMb 字段的中间对象。 Host 和 Application 类都将包含一个 List。

但是,问题在于,应用程序还需要了解其主机的某些方面,这些方面将包含在 Host 类中(例如,主机在地理上分布;应用程序需要知道它有多少个数据中心托管在其中,因此它需要能够检查其所有主机的 DC 名称。

因此,我可以让 HostedApplication 类同时保存对它所引用的 Host 对象和 Application 对象的引用。但在某些情况下,我需要遍历所有应用程序(在其他情况下,需要遍历所有主机)。因此,我需要 3 个单独的列表,一个列表和列表,以及一个列表,以便能够根据需要遍历所有三个列表。

我的基本问题是,处理这种配置的标准方法是什么?所有选项都有优点和缺点。我提到的最后一个选项似乎最正确,但是有三个列表是不是有点过分了?有没有更优雅的解决方案?

【问题讨论】:

【参考方案1】:

理想情况下,我可以与您讨论这个问题,但根据我对需求的粗略理解,这是一个潜在的解决方案(c++ 风格,省略了很多实现)

class Host 
public:

  string GeographicLocation() const;
  string DCName() const;
;

class HostAsAppearsToClient : public Host 

  HostAsAppearsToClient(const Host&);
  // Allows Host -> HostAsAppears... conversion

  size UsedMB() const;
  void UseMoreMB(size) const;
;

class Client 
  HostAsAppearsToClient* hosts;

  void AddHost(const Host& host) 
    // Reallocate enough size or move a pointer or whatever
    hosts[new_index] = HostAsAppearsToClient(host);
    hosts[new_index].UseMoreMB(56);
  

  void DoSomething() 
    hosts[index].UsedMB();
    // Gets the MB that that host is using, and all other normal host data if
    // we decide we need it ...
    print(hosts[index].DCName());
  
;

int Main() 
  Host* hosts = new Host[40];
  Client* clients = new Client[30];

  // hosts[2].UsedMB() // Doesn't allow

我完全认为这不符合您的要求,但请告诉我以什么方式,以便我更好地了解您的问题。

编辑:

VBA .... 倒霉:-P

可以在 VBA 中加载 dll,这将允许您使用任何其他语言编写和编译代码,并通过 VBA 将输入和输出从 UI 转发到 DLL,但我想这取决于您如果那是值得的。关于如何在 VBA Excel 中使用 dll 的文档:link

祝你好运!

【讨论】:

sji,这是一个好主意,而且是理想的,但是对于我忽略的一个问题......这必须在 VBA 中完成。所以继承是不允许的:(。但是,我可以使用包装类而不是直接持有主机的应用程序来做类似的事情。我相信在未来,一旦所有关于主机和应用程序的数据最终安装在数据库中,我们可能会将其转换为更通用的语言,所以我会记住这一点。但现在我坚持使用 excel。 @Swiftslide 我已添加到我的答案中以提供另一种可能的解决方案。如果您只需要使用 VBA,我认为包装类将是您可以使用的最佳解决方案。

以上是关于与对象的多对多关系,其中存在中间字段?的主要内容,如果未能解决你的问题,请参考以下文章

与多个中间表的多对多 Laravel Eloquent 关系

使 ModelForm 与 Django 中的中间模型的多对多关系工作的步骤是啥?

Hibernate的多对多关联关系

hibernate多对多映射中间表有多余字段问题该如何映射

与 SQLAlchemy 中不同的其他对象、自身和属性的多对多关系

当我使用中间模型时,如何建立强制唯一性的多对多关系?