Возможно ли создать отдельную таблицу для каждого объекта в базе данных, используя один класс ORM?Python

Программы на Python
Ответить
Anonymous
 Возможно ли создать отдельную таблицу для каждого объекта в базе данных, используя один класс ORM?

Сообщение Anonymous »

Я разработал базу данных с помощью системы ORM для управления данными финансового рынка.
Я использую Python с SQLAlchemy и SQLite.
Мне нужно чтобы получить последнюю запись для каждого актива из таблицы market_data, извлечь ее дату и время, запросить обновленные данные с сервера, а затем вставить новые данные обратно в таблицу market_data. Я планирую выполнять эту операцию несколько раз в минуту, поэтому скорость имеет важное значение. Однако выполнение текущего запроса занимает несколько минут. Я обнаружил, что процесс фильтрации для каждого актива является основным узким местом; без него запрос завершается мгновенно, но возвращает неправильные результаты.
Я думаю, хранить данные каждого актива в отдельной таблице было бы более эффективно, но я не могу создать отдельный класс для каждого актива. поскольку их можно добавлять динамически во время выполнения.
Есть ли способ создать несколько таблиц из одного класса ORM? Альтернативно, есть ли у вас какие-либо предложения по улучшению структуры базы данных для повышения скорости выполнения этого запроса?
Текущие модели базы данных:
class Date(Base):
__tablename__ = "dates"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, unique=True)
date: Mapped[datetime.date] = mapped_column(Date, nullable=False, unique=True)

class Time(Base):
__tablename__ = "times"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, unique=True)
time: Mapped[datetime.time] = mapped_column(Time, nullable=False, unique=True)

class Region(Base):
__tablename__ = "regions"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, unique=True)
name: Mapped[str] = mapped_column(String(30), nullable=False, unique=True)
markets: Mapped[List["Market"]] = relationship()

class Market(Base):
__tablename__ = "markets"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, unique=True)
name: Mapped[str] = mapped_column(String(20), nullable=False)
region: Mapped[int] = mapped_column(ForeignKey("regions.id"))
assets: Mapped[List["Asset"]] = relationship()

class Asset(Base):
__tablename__ = "assets"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, unique=True)
symbol: Mapped[str] = mapped_column(String(10), nullable=False, unique=True)
name: Mapped[str] = mapped_column(String(30), nullable=True)
market: Mapped[int] = mapped_column(ForeignKey("markets.id"))

class MarketData(Base):
__tablename__ = "market_data"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, unique=True)
date: Mapped[int] = mapped_column(ForeignKey("dates.id"))
time: Mapped[int] = mapped_column(ForeignKey("times.id"))
asset: Mapped[int] = mapped_column(ForeignKey("assets.id"))
opening: Mapped[float] = mapped_column(Float, nullable=False)
high: Mapped[float] = mapped_column(Float, nullable=False)
low: Mapped[float] = mapped_column(Float, nullable=False)
closing: Mapped[float] = mapped_column(Float, nullable=False)
volume: Mapped[float] = mapped_column(Float, nullable=True)

Запрос, который я тестировал, чтобы получить последнюю запись x одного актива:
session.query(MarketData).filter_by(asset=asset.id).order_by(desc(MarketData.id)).limit(10).all()


Подробнее здесь: https://stackoverflow.com/questions/792 ... abase-usin
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»