为了账号安全,请及时绑定邮箱和手机立即绑定

数据库表是否应使用 API 中定义的相同结构?

数据库表是否应使用 API 中定义的相同结构?

Go
温温酱 2022-08-24 15:49:34
假设我有一个gpc服务,并且有一个API可以创建新用户,如下所示: service UserService{  rpc CreateUser(CreateUserRequest) returns (CreateUserResponse);}message User {  string userId = 1;  string firstName = 2;  string lastName = 3;  string password = 4;}message CreateUserRequest {  user User = 1;}message CreateUserResponse {  user User = 1;}该服务将用户数据保存到PostgresDb中的users_table中,如下所示:user1 := NewUser() // instantiating the User object as defined in the proto file.// user2 := NewMyUser() // instantiating the MyUser object as defined separately in the service.result := s.db.Table(UsersTable).Create(user1) 此外,我正在使用proto缓冲区根据上面的api proto文件生成服务器和客户端代码。我的问题是:在实例化用户对象时,用户应该是在原型定义中定义的生成的用户结构吗?或者我应该像这样将另一个用户结构定义为专用于postgresDb的服务中的模型?struct MyUser {      userId string      firstName string       lastName  string       password string       createdAtMs int64 // an extra field not available in the api}后续问题:每种方法的优缺点是什么?它的最佳设计原则是什么?
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

这两种方式在实践中都会发生。这可能主要取决于您的服务有多少逻辑;逻辑很少的服务(例如,围绕数据库的小型包装器)更有可能将原型直接存储在数据库中。具有相似但略有不同的原型是很常见的,其中数据在通过系统时在每一步都被复制。

如果您将原型直接存储在数据库中,然后意识到您犯了一个错误,则可以通过创建一个与旧消息兼容的新消息(一个新名称,但所有相同的字段具有相同的ID)来“分叉”原型消息。您将代码迁移到新消息(将旧消息保留在服务中)的痛苦,但是使用此方法,您不必在交换到新消息类型之前重新编码数据库中的所有数据。

如果选择在数据库中使用相同的消息,则应确保在存储未知字段之前将其删除。否则,当您将来添加新字段时,您可能会发现已损坏/恶意的客户端已在该字段中存储了数据。


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号