Fehlende NOT NULL- und Eindeutigkeits-Constraints in der DB

Hallo,

ich möchte einen Bericht über einige Validierungen/Einschränkungen erstellen, die in den Modellen vorhanden, aber in der Datenbank fehlen.

Fehlende NOT NULL-Anforderungen

PostDetail - key, value sind im Modell erforderlich, aber in der Datenbank nullable.

  1. Erforderlich im Modell (app/models/post_detail.rb):

    validates_presence_of   :key, :value
    

    …Aber nullable in der Datenbank

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

    Wenn wir eine NOT NULL-Einschränkung zur Datenbank hinzufügen, ist es immer noch möglich, dass eine leere Zeichenkette durchkommt. Aber ich denke, dass NOT NULL zumindest etwas sicherer wäre.

Fehlende Unique-Einschränkungen

  1. TagGroup - name. Im Modell eindeutig (app/models/tag_group.rb)

    validates_uniqueness_of :name, case_sensitive: false
    

    Aber der Unique-Index fehlt in der Datenbank

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

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

    Die Datenbank hat einen Unique-Index auf (action, word), aber nicht auf (word) allein:

    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. Schließlich WebHookEventType - name. (app/models/web_hook_event_type.rb):

    validates :name, presence: true, uniqueness: true
    

    Fehlende Unique-Einschränkung in der Datenbank:

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

Vielleicht kann jemand bestätigen, ob diese Vorschläge sinnvoll erscheinen. Es ist möglich, dass sie helfen, Bugs zu verhindern, bevor sie auftreten. Falls ja, scheint die Korrektur ziemlich unkompliziert zu sein, und ich würde gerne einen Pull Request erstellen, falls das hilfreich ist.

Vielen Dank.

Fallunabhängige eindeutige Constraints sind etwas knifflig. Ich bin unsicher, ob ich die citext-Erweiterung dafür hinzufügen soll, und wir wären dann gezwungen, auf name_lower umzusteigen und die Spalte nur für den Index zu duplizieren.

Ja, das sollten wir beheben.

Es wäre ebenfalls in Ordnung, hier einen Index hinzuzufügen.