Absence de contraintes NOT NULL et d'unicité dans la base de données

Bonjour,

Je souhaite signaler plusieurs validations/contraintes présentes dans les modèles mais manquantes au niveau de la base de données.

Contraintes NOT NULL manquantes

PostDetail - key, value sont requis dans le modèle mais autorisent des valeurs nulles dans la base de données.

  1. Requis dans le modèle (app/models/post_detail.rb) :

    validates_presence_of   :key, :value
    

    …Mais autorisant des valeurs nulles dans la base de données

    discourse_development=# \d post_details
                                            Table "public.post_details"
       Column   |            Type             | Collation | Nullable |                 Default
    ------------+-----------------------------+-----------+----------+------------------------------------------
     ...
     key        | character varying           |           |          |
     value      | character varying           |           |          |
    

    Si nous ajoutons une contrainte NOT NULL à la base de données, il sera toujours possible qu’une chaîne vide passe, mais je pense que l’ajout de NOT NULL apportera au moins un peu plus de sécurité.

Contraintes d’unicité manquantes

  1. TagGroup - name. Unique dans le modèle (app/models/tag_group.rb)

    validates_uniqueness_of :name, case_sensitive: false
    

    Mais l’index unique manque dans la base de données

    discourse_development=# \d tag_groups
    ...
    Indexes:
        "tag_groups_pkey" PRIMARY KEY, btree (id)
    
  2. De même, WatchedWord - word. (app/models/watched_word.rb)

    validates :word,   presence: true, uniqueness: true, length: { maximum: 50 }
    

    La base de données possède un index unique sur (action, word) mais pas sur (word) seul :

    discourse_development=# \d watched_words
    ...
    Indexes:
        "watched_words_pkey" PRIMARY KEY, btree (id)
        "index_watched_words_on_action_and_word" UNIQUE, btree (action, word)
    
  3. Enfin, WebHookEventType - name. (app/models/web_hook_event_type.rb) :

    validates :name, presence: true, uniqueness: true
    

    Contrainte d’unicité manquante dans la base de données :

    discourse_development=# \d web_hook_event_types
    ...
    Indexes:
        "web_hook_event_types_pkey" PRIMARY KEY, btree (id)
    

Peut-être qu’une personne pourrait confirmer si ces observations semblent raisonnables. Il est possible qu’elles aident à prévenir un bug avant qu’il ne se produise. De plus, si tel est le cas, la correction semble assez simple, et je suis heureux de créer une pull request si cela peut être utile.

Merci.

Les contraintes d’unicité insensibles à la casse sont un peu délicates. Je suis réticent à ajouter l’extension citext pour cela, car nous serions alors obligés de créer un champ name_lower et de dupliquer la colonne simplement pour ajouter l’index.

Oui, nous devrions corriger cela.

Il est également tout à fait acceptable d’ajouter un index ici.