我的客户在注册我的申请时会使用以下其中一项:
(假名,为简单而省略了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
值的方法。
如果您必须为此问题建模解决方案,此解决方案是否正确,或者您是否有另外一种方法?请解释您的理由(即,更好的表现等)
答案 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个属性(例如authenticationCode
,userId
,password
),以及API名称/代码到GUI属性名称的映射。当用户选择首选API时,我可以在GUI上显示具有相应名称的字段,并将值填充到UserLogin
的相应属性中。如果需要,UserLogin还可以存储该用户的首选登录API。这样,UserLogin就会映射到数据库端的单个表。我可以使用另一个表来配置每个已知API的属性名称。