REST API最佳做法

时间:2019-03-31 07:28:22

标签: rest database-design

我想知道从REST API和数据库设计的角度来看,这种情况的最佳实践是什么。

一种情况是,我们有一本书的页面上有单词。

  • Books具有一个外部ID(例如import pandas as pd import numpy as np np.random.seed(1) df = pd.DataFrame( index=pd.period_range('2018-01-01', periods=100, freq='D'), columns=range(3), data=np.random.randn(100, 3) ) def custom_func(sub_df: np.ndarray) -> np.ndarray: # do something, return a matrix # fora minimal example, return sub_df.T @ sub_df # the real task is much more complicated... return sub_df.T @ sub_df # can I apply custom_func using rolling? # the return should be a 3D numpy array # like # resarray = df.rolling(window=5).apply(custom_func) ),我想用它来引用它。

    my_external_id

  • 我想通过页码(1、2、3等)或外部页面ID(GET /books/my_external_id/)来引用页面。我需要定义我以何种方式引用哪种类型的页面ID?

    my_external_page_id

    GET /books/my_external_id/pages/1

    PUT /books/my_external_id/pages/1

    GET /pages/my_external_page_id

  • 我想根据书的页码获取和添加单词。

    PUT /pages/my_external_page_id

    GET /books/my_external_id/pages/1/words

    PUT /books/my_external_id/pages/1/words

    GET /pages/my_external_page_id/words

完整的解决方案在这里是什么?

1 个答案:

答案 0 :(得分:1)

  

我需要定义我要引用的页面ID类型吗?   不知何故?   我会说这取决于您要查询的内容

如果您GET在写书,则书的页面从1开始顺序编号。

GET /books/my_external_id/pages/1

以上内容对我来说很有意义,因为您要的是Page所标识的Book中的my_external_id 1。该Page将具有Word与其关联。因此,您的数据模型由以下对象组成:

Book具有1个或多个Page具有1个或多个Word

以上内容可用于建模您的书籍,页面和单词的世界。 my_external_id仅用于进入书籍世界。也就是说,这是您获得图书的唯一途径。如果您进入实体图书馆,则需要图书馆会员卡才能将书拿出来,但由于该书具有诸如页面和单词之类的内在属性,因此您不需要该会员卡即可阅读该书。因此,一旦您使用my_external_id(实际上是您的借书证)来获取图书,就应该能够使用此数据模型:

GET /books/my_external_id/pages/1
GET /books/my_external_id/pages/1/words/
GET /books/my_external_id/pages/1/words/23

假设my_external_page_idmy_external_word_id在所有书籍中都是唯一的,则可以使用其他入口点(小型图书馆卡?)在不同点输入数据模型:

GET /pages/my_external_page_id
GET /words/my_external_word_id

,但是之后您将进入“数据模型”模式,即在页面上获取第50个字:

GET /pages/my_external_page_id/50

使用第50个单词代替my_external_word_id,这是一个入口点,而不是数据模型(50)。

更新的原理相同。只需选择要处理的模型对象:

获取书籍的第10页:

GET /pages/my_external_page_id

获取该页面的所有单词:

GET /pages/my_external_page_id/words

更新第10页上的第20个字:

PUT /pages/my_external_page_id/words/20

以上使用数据模型方法。 my_external_page_id让您拥有Page个实例的Word,并且您想更新第20个Word实例,而不是使用my_external_word_id来返回单个{{ 1}}实例。

最终,您的模型可能是:

Word具有{{1}的列表中的BookidtitleauthorisbnnumberOfPages }}实例。

listOfPages具有Page和一个Page实例的列表。它也可以有id,但这仅与拥有它的Word有关。要获得number中的第十Book,可以通过Page中的Book进行,也可以迭代listOfPages直到找到BooklistOfPages

单词有Pagenumber = 10

这应该足够了,除非您想要独立于id实例访问textPage实例,但是最终您需要在流程中的某个地方Word这样是BookBook唯一的来源。