数据建模问题

时间:2010-10-07 08:14:27

标签: database design-patterns database-design data-modeling

我的客户在注册我的申请时会使用以下其中一项:

  1. Foo API (需要“ auth_key ”,“密码”,“电子邮件”)
  2. Acme API (需要“ secure_code ”,“用户名”,“密码”)
  3. Bar API (需要“ xyz_code ”,“ pass_key ”)
  4. (假名,为简单而省略了15个以上)

    我不希望在我的数据库中只有10-15个表用于我提供的不同API集成选项(特别是当它们全部用于相同的事情而他们只从整个列表中选择1时)。

    我的解决方案是:

    制作一个api_configuration表,其中包含一个名为api_name的列,其中包含特定API的代码(例如"foo_api"

    创建一个名为credentials_attribute的表格,其外键返回api_configuration,列为name,列为value

    然后我构建了一个用于选择API的UI。如果他们选择Acme API,它会询问“secure_code”,“username”和“password”,并在credentials_attribute为每个名称/值对创建一行。

    api_configuration的ORM模型上,我可以根据当前credentials_attribute制作查找api_name值的方法。

    如果您必须为此问题建模解决方案,此解决方案是否正确,或者您是否有另外一种方法?请解释您的理由(即,更好的表现等)

3 个答案:

答案 0 :(得分:1)

我可能更喜欢用单个表本身来做这个

有一个UserAuthentication表格,其中包含IdentificationKey, AuthenticationCriteria1, AuthenticationCriteria2等列,等等......

AuthenticationCriteriaX列的数量=任何API将拥有的最大条件数。我假设它会是一些合理的东西,比如最多5个,但是15-20之间的任何东西实际上仍然是一个非常小的桌子。

UserAuthentication表还有一个api_key列,它是MASTER_API表中的外键,它是所有支持的API的列表

至于问题的UI部分,即向UserAuthentication表中的任何字段显示用户的标签,我认为这只是一个UI关注点,因此您应该只具有特定于UI层中的每个api。 api_key列可根据需要用于翻译。数据库不一定需要知道这些细节,IMO。

答案 1 :(得分:1)

如果我理解这个案例,那看起来就像是gen-spec设计模式的另一种情况。查找“泛化专业化关系建模”。

关于对象建模的教程通常涵盖gen-spec,但关于关系建模的教程通常不会。但它很好理解,网上有一些优秀的文章。

答案 2 :(得分:0)

如果我理解正确的话,不同API中的所有这些属性都是概念上相同的3个元素的元组,在不同的名称下,对吧?

您的描述来自数据库的观点 - 我将描述我将在域方面做什么(可以直接映射到您的架构)。

我会创建一个单独的类,例如UserLogin,具有上述3个属性(例如authenticationCodeuserIdpassword),以及API名称/代码到GUI属性名称的映射。当用户选择首选API时,我可以在GUI上显示具有相应名称的字段,并将值填充到UserLogin的相应属性中。如果需要,UserLogin还可以存储该用户的首选登录API。这样,UserLogin就会映射到数据库端的单个表。我可以使用另一个表来配置每个已知API的属性名称。