关于如何构建数据模型的思考

时间:2017-05-02 06:04:07

标签: rest api-design datamodel

假设我有两个模型用于RESTful API合同:用户和交付

// User

id      | Long
-----------------
name    | String
-----------------
street1 | String
-----------------
street2 | String
-----------------
city    | String
-----------------
state   | String
-----------------


// Delivery

id           | Long
--------------------
recipient_id | Long
--------------------

此结构假定交付与用户绑定,而实际上他们将绑定到地址。在三种模型中构建数据似乎更有意义:用户,交付和地址:

// User

id         | Long
--------------------
name       | String
--------------------
address_id | Long


// Delivery

id           | Long
--------------------
recipient_id | Long
--------------------
address_id   | Long
--------------------

// Address

id      | Long
-----------------
street1 | String
-----------------
street2 | String
-----------------
city    | String
-----------------
state   | String
-----------------

拥有三个模型的缺点是,如果要获取交付的街道地址,则必须在每个请求上加入。但是,业务逻辑在语义上是这样的。交付与地址相关联,用户也是如此,这是对其关系的恰当描述。如果api响应需要用户和地址之间的联合类型,则可以声明具有来自地址和用户模型的值的UserAddress类型。但我不确定哪一个是正确的方法。请提供一些有关如何做的建议。

1 个答案:

答案 0 :(得分:0)

个人观点,第二种结构是合适的。由于总地址(包括街道,城市等)将是单个用户的一个属性,因此我认为将所有这些属性添加到用户信息不是一个好的决定。

中级,如果用户更新他/她的地址怎么办?如果更新的地址已经在地址表中,你只能更改有界的address_id,但如果使用第一个结构,你应该更新所有的地址属性用户。

顺便说一句,从UML方面来看,第二选择也会更好。从流程中可以看出,传递与地址有关,一个地址与一个用户有关。同时,地址仅限于用户,但不是用户的属性,例如:我使用酒店地址作为订单的地址,但如果我已经检查了怎么办?你还要为这种情况更新用户表吗?

所以总而言之,我认为第二种选择比第一种选择更好,无论是结构方还是现实方。

希望能为你做一点帮助。 : - )