0

だから私はdjangoプロジェクトのために次のモデル構造を持っています

class RawData(models.Model):
    user = models.ForeignKey(User)
    timestamp = models.DateTimeField()
    ...
    value = models.PositiveIntegerField()

class SummarizedData(models.Model):
    SUMMARY_DURATION = (
        ('H', 'Hour'),
        ('D', 'Day'),
        ('M', 'Month'),
        ('Y', 'Year')
    )
    user = models.ForeignKey(User)
    duration = models.CharField(max_length=1, choices=SUMMARY_DURATION)
    timestamp = models.DateTimeField()      #for keeping track of which duration's data is this
    ...
    min_max_values = models.ManyToManyField(RawData)

今、私の問題はmin_max_valuesに関連しています。SummarizedDataごとに2つのRawDataタプルが必要です。1つはその期間に表示される最小のRawData値に対応し、もう1つはそのような最大値に対応します。

ただし、特定のRawDataタプルが複数のSummarizedDataエントリの最小値になる可能性があるため(たとえば、特定の時間、同じ日など)、多対多の関係を介してそれらを関連付けました。しかし、それぞれの値を比較しない限り、SummarizedDataに関連する2つのRawData値のどちらが最大で、どちらが最小であるかを識別する方法を理解できません。したがって、今のところ、getMaxValueやgetMinValueなどの関数をSummarizedDataに含めることにします。

私の質問は、そのような特定のケースでは、SummarizedDataにそれぞれが単一のRawDataフィールドに対応する2つのフィールドを含めることはできないのでしょうか?多分このように?

min_value = models.OneToOneField(RawData)
max_value = models.OneToOneField(RawData)

それとも、最初のアプローチを採用する必要がありますか?

編集済み

申し訳ありませんが、OneToOneFieldの代わりにForeignKeyを使用する必要がありました

min_value = models.ForeignKey(RawData)
max_value = models.ForeignKey(RawData)
4

1 に答える 1

2

次の理由により、データを多対多フィールドとして保存する必要はないと思います。

  1. どの値が最小でどれが最大かを判断するために、明示的な関数を作成する必要があります
  2. 最小値または最大値を個別に保存すると、集計操作(平均、合計、最小、最大など)や並べ替えなど(表形式で表示されている場合)が簡単になります。

これにより、余分な計算が大幅に節約され、必要な処理を実行するために必要なコード行が少なくなるため、min_valueとmax_valueに別々のForeignKeyフィールドを使用することをお勧めします。

min_value = models.ForeignKey(RawData)
max_value = models.ForeignKey(RawData)
于 2012-10-26T08:08:06.240 に答える