我正在为一个项目编写一个应用程序框架,其中每个应用程序都是一组功能。为了描述这些功能(参数架构,返回架构,插件信息等),我使用的是类似OpenAPI 3.0的语法:https://swagger.io/specification/
这些应用程序API描述使用SQLAlchemy存储在PostgreSQL数据库中,并使用棉花糖进行序列化/反序列化。
我的问题主要涉及诸如Info对象之类的嵌套对象:https://swagger.io/specification/#infoObject
在我看来,我可以通过以下两种方式之一进行处理:
A:只需将对象的JSON表示形式存储在列中,然后自己验证该对象的架构:
class AppApi(Base):
__tablename__ = 'app_api'
id_ = Column(UUIDType(binary=False), primary_key=True, nullable=False, default=uuid4)
info = Column(sqlalchemy_utils.JSONType, nullable=False)
B:为每个嵌套对象创建一个新表,并在序列化过程中依靠棉花糖对模式进行验证:
class AppApi(Base):
__tablename__ = 'app_api'
id_ = Column(UUIDType(binary=False), primary_key=True, nullable=False, default=uuid4)
info = relationship("Info", cascade="all, delete-orphan", passive_deletes=True)
class ApiInfo(Base):
__tablename__ = 'api_info'
id_ = Column(UUIDType(binary=False), primary_key=True, nullable=False, default=uuid4)
app_api_id = Column(sqlalchemy_utils.UUIDType(binary=False), ForeignKey('app_api.id_', ondelete='CASCADE'))
name = Column(String(), nullable=False)
description = Column(String(), nullable=False)
...etc.
我倾向于选择选项A,因为它似乎很少参与其中,但是选项B感觉更“正确”。选项A给我更大的灵活性,不需要我为每个对象创建模型,但是选项B使数据库中存储的内容更加清楚。
该应用程序的信息对象将不会独立于该应用程序API的其余部分而被访问,因此我不确定为其创建单独的表是否有很大价值。
选择一个或另一个我应该考虑哪些其他因素?
答案 0 :(得分:0)
我认为B更好。
使用此配置,您可以更快(更容易)访问ApiInfo列。