غياب قيود NOT NULL والتفرد في قاعدة البيانات

مرحبًا،

أود تقديم تقرير حول بعض القيود/التحققات الموجودة في النماذج ولكنها مفقودة في قاعدة البيانات.

متطلبات عدم السماح بالقيمة الفارغة المفقودة

تفاصيل المنشور (PostDetail) - المفتاح (key)، القيمة (value) مطلوب وجودها في النموذج، لكنها قابلة للقيمة الفارغة (nullable) في قاعدة البيانات.

  1. مطلوب في النموذج (app/models/post_detail.rb):

    validates_presence_of   :key, :value
    

    …لكنها قابلة للقيمة الفارغة في قاعدة البيانات

    discourse_development=# \d post_details
                                            Table "public.post_details"
       Column   |            Type             | Collation | Nullable |                 Default
    ------------+-----------------------------+-----------+----------+------------------------------------------
     ...
     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
    ...
    Indexes:
        "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
    ...
    Indexes:
        "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
    ...
    Indexes:
        "web_hook_event_types_pkey" PRIMARY KEY, btree (id)
    

ربما يتمكن شخص ما من تأكيد ما إذا كانت هذه تبدو معقولة. فمن الممكن أن تساعد في منع حدوث خطأ قبل وقوعه. أيضًا، إذا كان الأمر كذلك، فسيبدو الإصلاح بسيطًا جدًا، وسأكون سعيدًا بإنشاء طلب دمج (pull request) إذا كان ذلك مفيدًا.

شكرًا لك.

تقييدات التفرّد غير الحساسة لحالة الأحرف معقدة بعض الشيء؛ أشعر بالتردد في إضافة امتداد citext لهذا الغرض، وسيضطرّ حينها استخدام name_lower ونسخ العمود فقط لإضافة الفهرس.

نعم، يجب أن نصلح هذا.

من المقبول أيضًا إضافة فهرس هنا.