3

我正在设计一个处理两组数据的应用程序——用户和区域。数据是从第三方生成的文件中读取的。我有一个用户类和一个区域类,数据被读入一个用户数组和一个区域数组(或其他适当的内存结构,取决于我们采用的技术)。

这两个类都有一个从文件中读取的唯一 ID 成员,并且 User 类包含一组区域 ID,给出一个用户与多个区域相关联的关系。

要求非常简单:

  • 用户列表
  • 地区列表
  • 指定区域用户列表
  • 指定用户的区域列表

我的第一个想法是将数据留在两个数组中,然后对于每个要求,有一个单独的方法可以根据需要询问一个或两个数组。这很容易实现,但我不相信它一定是最好的方法。

然后我考虑在 User 类上有一个“Get Areas”方法,在 Area 类上有一个“Get Users”成员,这会更有用,例如,如果我正处于我有一个 Area 对象的阶段,我可以找到它是一个属性的用户,但是 Area 类上的“获取用户”方法如何知道/有权访问用户数组。

我之前遇到过这个问题很多次,但从来没有真正想出一个明确的解决方案。也许我只是让它比实际情况更复杂。任何人都可以提供任何可以帮助我进行此类设计的提示、URL 或书籍吗?

更新:感谢大家花时间留下一些提示。非常感谢您的意见。

我同意这个问题的根源是多对多关系。我了解如何在关系数据库中对其进行建模,这非常简单。

我收到的数据是来自第三方的二进制文件的形式,所以我无法控制这些文件的结构,但我可以在读取时以最好的方式存储它。它有点像圆形的钉子漏洞,但我认为将其读取然后将其存储在数据库中,然后程序将不得不查询数据库以获取结果。这不是大量的数据,所以我认为可以通过将其存储在内存结构中来获取我需要的内容。

4

7 回答 7

7

这真的是多对多的关系,

User <<--->> Area

将其分解为 3 个对象,User、Area 和 UserArea:

User: Id, name, etc.
Area: Id, name, etc.
UserArea: UserId, AreaId
于 2008-09-30T15:58:55.990 回答
3

非常基本,但想法是:

struct/class Membership
{
   int MemberID;
   int userID;
   int areaID;
}

该类实现了“用户属于区域”的成员资格概念。为集合中的每个成员粘贴其中一个,并在该集合中查询满足您要求的子集。

编辑:另一种选择

您可以在每个成员中存储一个区域列表,并在每个区域中存储一个成员列表。

在地区:

public bool addMember(Member m)
{
   if (/*eligibility Requirements*/)
   {
      memberList.add(m);
      m.addArea(this);
      return true;
   }
   return false;
}

和 Member 中的类似实现(没有回调)

这样做的好处是很容易返回一个迭代器来遍历一个区域并找到成员(反之亦然)

缺点是它的耦合非常紧密,这可能会导致未来的问题。

我认为第一个实现对 LINQ 更友好。

于 2008-09-30T16:03:26.917 回答
2

一个区域是否属于多个用户?如果是,从技术上讲,这是一个多对多的关系。如果要将数据转换为关系数据库,则需要创建一个包含所有关系的表。我想如果你想使用数组,你可以创建第三个数组。或者,如果您确实想以 OO 方式执行此操作,则两个类都应具有指向相关区域/用户的指针数组。

于 2008-09-30T15:59:19.033 回答
1

很抱歉,但这不是面向对象的问题。这是一个关系问题。因此,所有对基数的引用(多对多)。这是关系数据库建模101。我不是要批评Gavin,只是要指出一个新的视角。

所以我的咆哮有什么好处。答案应该是与关系数据存储集成,而不是将其融入面向对象的范例中。这是经典的方钉圆孔问题。

于 2008-09-30T16:57:01.407 回答
0

同意 dacracot

另请查看 DevExpress XPO

于 2008-09-30T19:51:58.630 回答
0

如果涉及 .NET,为什么不将 DataTables 与关系一起使用?如果涉及 .NET,您可能还想再次研究泛型。

于 2008-09-30T15:57:16.417 回答
0

一种选择是为最后两个要求中的每一个使用字典。即 aDictionary<Area, List<User>>和 a Dictionary<User, List<Area>>。您可以在读取数据时构建它们。您甚至可以围绕这两个字典包装一个类,并在该类上为每个需求提供一个方法。这将允许您确保字典保持同步。

于 2008-09-30T16:00:44.100 回答