我想知道从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
完整的解决方案在这里是什么?
答案 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_id
和my_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}的列表中的Book
,id
,title
,author
,isbn
和numberOfPages
}}实例。
listOfPages
具有Page
和一个Page
实例的列表。它也可以有id
,但这仅与拥有它的Word
有关。要获得number
中的第十Book
,可以通过Page
中的Book
进行,也可以迭代listOfPages
直到找到Book
与listOfPages
。
单词有Page
和number = 10
。
这应该足够了,除非您想要独立于id
实例访问text
和Page
实例,但是最终您需要在流程中的某个地方Word
这样是Book
和Book
唯一的来源。