设计数据库架构的Web服务API

时间:2014-01-31 09:09:02

标签: database web-services rest database-design database-schema

假设我的数据库中有以下表格(如果需要,我可以随意重新设计):

  • 用户:有关每个用户拥有的系统用户的信息 授权。
  • 授权:有关每项授权含义的信息。每 授权与其适用的许多主机相关联。
  • 主机:有关应用程序中涉及的主机的信息。每个主持人都有一个 位置。
  • 区域:将位置组合在一起。
  • 位置:将主机组合在一起。

我想为这个数据库模式设计一个webservice接口 此Web服务的客户将能够提出以下问题:

  • 这个系统的用户是什么?
  • 哪些授权有用户X?
  • 在什么位置是主持人Y?
  • Z位置的主机是什么? - 。 ....等等。

此界面的功能/方法应该是什么?

  • 一个流行的解决方案是:
    • getuser(id)/ getusers()获取用户以及列表 每个用户拥有的授权ID。
    • getauth(id)/ getauths()获取所有授权以及 他们适用的主机ID列表。
    • gethost(id)/ gethosts()获取所有主机。随着的ID 每个主机的位置。 .....

使用此方案,获取主机的位置意味着进行两次调用 到了api:

   h = gethost(id),
   loc_id = h.location_id; 
   location = getlocation(loc_id);

我不喜欢这种方法是它强迫客户 api对API进行大量(异步)调用跟踪 在获得他想要的信息之前,对象的层次结构。

根据您的经验,这是最好的方法吗?

PS。如果您的解决方案涉及更改架构,我也很满意。

编辑:换句话说,我想要的是

之间的良好中间地带
  • 解决方案1:Web服务只有一个方法:query(String),它接受某种数据库查询语言(如SQL)中的查询。

  • 解决方案2:Web服务为用户可能需要的每个可能的查询提供了一种方法:getUserWithAuthorization(user_id)getUser(user_id)getLocationOfHost(host_id)getAreasWithLocations(),... etc. #interfacebloatinghell。

1 个答案:

答案 0 :(得分:0)

首先,删除所有动词(getResourceX)。

通常,您可以通过客户端可以执行单个调用并获取所有信息的方式来设计API,但也可以在更精细的级别上获取数据。

如果我正确地假设您从最大到最小子集的数据集是这样的: 领域 - >地点 - >主持人 - >授权 - >用户

所以这可以是你的资源URI

1接到电话

api/areas 

将返回所有区域及其所有位置以及每个位置的主机等。

如果您需要有关特定区域的信息,可以执行 1次呼叫

/api/areas/{id}