51:参照頻度が低いカラムはテーブルを分ける

必要なデータすべてを1つのテーブルに押し込めていませんか? テーブルが肥大化する問題と解決方法を説明します。

具体的な失敗

class User(models.Model):
    username = models.CharField(...)
    email = models.EmailField(...)
    ...

    enable_notification_release = models.BooleanField(..., help_text="リリースのお知らせを受け取る場合True")
    enable_notification_security = ...
    enable_notification_mailmagazine = ...
    enable_notification_important = ...

参照頻度の低い「リリースのお知らせを受け取るかどうか」という情報を、Userというユーザーアカウントを表すテーブルに保持しています。 大きな問題ではありませんが、より良いテーブル設計の方法があるはずです。

ベストプラクティス

「通知の設定」に関する情報を、 UserNotificationSettings という別のテーブルに保持させます。

class User(models.Model):
    username = models.CharField(...)
    email = models.EmailField(...)
    ...


class UserNotificationSettings(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    enable_release = models.BooleanField(..., help_text="リリースのお知らせを受け取る場合True")
    enable_security = ...
    enable_mailmagazine = ...
    enable_important = ...

テーブルのカラムが増えると参照や JOIN が遅くなる問題があります。 参照したときのデータ転送時に、データ量が多くなり、JOINする際に、必要な一時テーブルの容量が多くなるためです。

cover

(中略)詳細は書籍 自走プログラマー をご参照ください