Django 모델 테이블을 정의할 때, 인덱스에 반복 사용하는 여러개의 필드를 모아서 별개의 테이블로 만들고 이를 상속받는 방식으로 모델을 정의 하였습니다.

class Ticker(models.Model):
    code = models.CharField(blank=True, null=True, max_length=10)
    name = models.CharField(max_length=50, unique=True)


class Index(models.Model):
    date   = models.DateField()
    ticker = models.ForeignKey(
        Ticker, on_delete=models.CASCADE, 
        related_name='index'
    )

    class Meta:
        indexes = [models.Index(fields=['date','ticker']),]


문제점

특정한 종목의 특정한 날짜의 값을 기준으로 개별 index 가 정의가 되어 있습니다. 때문에 특정종목의 특정한 날 데이터를 호출하기는 용이한데, 문제는 특정종목의 특정한 날짜 구간의 데이터 를 호출하려면 복잡한 Query 를 요구합니다. 게다가 1종목의 여러가지 데이터를 호출하려면 Index 테이블을 반복적으로 경로를 중복하여 호출을 해야되서 병목현상 이 발생하기에도 쉬워서 이러한 구조를 해체하고 기존의 방식으로 되돌아 가도록 결정 하였습니다.


보완점

위와같은 구조를 전체에 적용하기는 어렵지만 부분적으로 적용해 보도록 하겠습니다. Ohlcv 테이블을 부모 테이블로 하고 HourlyPrice Table 을 자식의 관계로 정의를 해 보겠습니다.

class Ohlcv(models.Model):
    ticker = models.ForeignKey(
        Ticker, on_delete=models.CASCADE, 
        related_name='index_ohlcv'
    )
    date  = models.DateField()
    open  = models.IntegerField()
    high  = models.IntegerField()
    low   = models.IntegerField()
    close = models.IntegerField()
    volume = models.IntegerField()

    def __str__(self):
        return f"{self.index.date} {self.index.ticker}"

    class Meta:
        indexes = [
            models.Index(fields=['ticker','date']),  # `index_id` 인덱스 추가
        ]


class PriceDatetime(models.Model):

    index = models.ForeignKey( 
        Ohlcv, on_delete=models.CASCADE, 
        related_name='index_price_time'
    )
    # 인덱싱한 나머지 시간 데이터
    # : `datetime.now().time().replace(second=0, microsecond=0)`
    day_time = models.TimeField()
    price  = FloatRoundUpField()
    volume = models.IntegerField()

    def __str__(self):
        return f"{self.index} {self.day_time}"