我正在尝试编写一个MySQL连接器,用于MS的Forefront Identity Manager(FIM基本上是一个同步引擎,它使用元目录在各种数据源之间同步身份)。但是我很难设计出一个合适的方案。
假设我想将用户数据从数据库导入到FIM的元目录中。用户对象具有各种属性,如名字、姓氏、地址等。在数据库中,这些属性可以分布在多个表中。FIM最终需要将这些属性合并为一个对象。因此,用户需要配置连接器以告诉它数据在DB中的存储方式。
我想知道表示此配置的“最佳”方法是什么。两种替代方案浮现在我的脑海中:
- 我可以保存一个合并/连接数据的选择查询,使结果成为带有所有所需属性的单个“表格”。但问题在于,我认为我需要对这个查询字符串进行某种解析,以创建一个fim兼容模式的架构(基本上是对象类型的名称(例如“person”)和属性列表)。这个模式需要仅通过查询字符串就能创建而不实际执行查询(如果这能简化过程,我可以执行一些虚假查询)。
- 我可以创建一些类来表示数据库模式,即表格和关系。由于我对MySQL(或者数据库)不是很熟悉,因此存在错过一些特殊情况的风险。另外,这可能是一种过度设计,因为一旦配置好了模式,它就可以被视为固定的。
是否有人对应该选择哪种替代方案以及如何解决相应问题有建议?或者还有其他更好的替代方案吗?任何建议都将不胜感激!如果有不清楚的地方,请告诉我。
编辑:由于有一些关于用例的问题,我会详细说明一下:
作为我已经说过的,我正在开发FIM的管理代理。 FIM提供所谓的可扩展连接管理代理,它基本上是一个实现了几个接口的单个类。(请参见this technet guide以获取示例实现)。由于我想为管理MySQL
数据库中的标识开发通用代理,因此我不知道数据库布局在编译时。当最终用户想要使用管理代理时,他需要决定他想管理哪些身份的属性。因此,我需要给用户一些方法来配置管理代理。我的主要问题是如何设计类来保存这个配置。让我们看一个简单的例子: 假设您想管理员工身份。为了简单起见,我们有三个属性:
- firstName - lastName - department
在这个例子中,它可能只是一个有4列的单个表格(属性加上一个ID)。但更好的设计是使用两个表格,一个用户表和一个部门表,使用1:1关系来定义用户所属的部门。
FIM要求我将这些属性合并到一个对象中。它提供了一个类CSEntryChange,其中包含AttributeChanges集合成员。然后我会创建一些AttributeChange实例(基本上包含属性名称和其值),并将它们添加到集合中。因此,可编辑的配置必须告诉管理代理如何从数据库中获取具有所有定义属性的用户,并且如何在该数据库中创建和修改用户。
理想情况下,我会有一个“MySQLSchema”类的实例(由用户事先配置),它可以返回一个包含数据库中所有用户的
List<CSEntryChange>
(为了解耦合,我实际上不会使用CSEntryChange
类,但你应该明白我的意思)。此外,我希望能够传递一个CSEntryChange
,这将导致相应的数据库条目被更新(如果尚未存在则创建)。希望这样能更加清楚 :)