Отсутствуют ограничения NOT NULL и уникальности в БД

Привет,

Хотел сообщить о нескольких валидациях/ограничениях, которые существуют в моделях, но отсутствуют в базе данных.

Отсутствуют требования NOT NULL

PostDetail - ключ, значение должны быть обязательными в модели, но в БД они допускают NULL.

  1. Требуется в модели (app/models/post_detail.rb):

    validates_presence_of   :key, :value
    

    …Но допускают NULL в БД

    discourse_development=# \d post_details
                                            Таблица "public.post_details"
       Столбец   |            Тип             | Сопоставление | Допускает NULL |                 Значение по умолчанию
    ------------+-----------------------------+---------------+----------------+------------------------------------------
     ...
     key        | character varying           |               |                |
     value      | character varying           |               |                |
    

    Если мы добавим ограничение NOT NULL в БД, всё ещё возможно, что пустая строка пройдёт, но я считаю, что наличие NOT NULL хотя бы немного повысит безопасность.

Отсутствуют уникальные ограничения

  1. TagGroup - name. Уникальность в модели (app/models/tag_group.rb)

    validates_uniqueness_of :name, case_sensitive: false
    

    Но в БД отсутствует уникальный индекс

    discourse_development=# \d tag_groups
    ...
    Индексы:
        "tag_groups_pkey" PRIMARY KEY, btree (id)
    
  2. Аналогично, WatchedWord - word. (app/models/watched_word.rb)

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

    В БД есть уникальный индекс по (action, word), но не по одному только (word):

    discourse_development=# \d watched_words
    ...
    Индексы:
        "watched_words_pkey" PRIMARY KEY, btree (id)
        "index_watched_words_on_action_and_word" UNIQUE, btree (action, word)
    
  3. Наконец, WebHookEventType - name. (app/models/web_hook_event_type.rb):

    validates :name, presence: true, uniqueness: true
    

    Отсутствует уникальное ограничение в БД:

    discourse_development=# \d web_hook_event_types
    ...
    Индексы:
        "web_hook_event_types_pkey" PRIMARY KEY, btree (id)
    

Возможно, кто-то сможет подтвердить, выглядят ли эти предложения разумными. Возможно, они помогут предотвратить ошибку до её возникновения. Также, если это так, исправление, кажется, будет довольно простым, и я с радостью создам pull request, если это будет полезно.

Спасибо.

Независимые от регистра уникальные ограничения немного хитрые. Я не уверен насчёт добавления расширения citext для этого, и тогда нам пришлось бы использовать name_lower и дублировать столбец только для того, чтобы добавить индекс.

Да, нам стоит это исправить.

Также можно добавить индекс здесь.