SQLAlchemy-何时制作额外的模型和关系,而仅仅是将JSON存储在列中?

时间:2019-03-14 13:32:29

标签: python database postgresql sqlalchemy marshmallow

我正在为一个项目编写一个应用程序框架,其中每个应用程序都是一组功能。为了描述这些功能(参数架构,返回架构,插件信息等),我使用的是类似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的其余部分而被访问,因此我不确定为其创建单独的表是否有很大价值。

选择一个或另一个我应该考虑哪些其他因素?

1 个答案:

答案 0 :(得分:0)

我认为B更好。

使用此配置,您可以更快(更容易)访问ApiInfo列。