PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Има ли опции за таблица за присъединяване за асоциации много към много?

  • Ако моделите не споделят цветови групи, тогава дизайнът ще бъде една таблица:

    model [model] comes in color [color]
    
  • Ако моделите споделят цветови групи, тогава има две таблици:

    model [model] comes in the colors of group [group]
    group [group] has color [color]
    

    Тези таблици се присъединяват с проекция към първата таблица:

    SELECT model, color FROM model_group NATURAL JOIN group_color
    
  • Ако моделът може да има изключителни налични и/или недостъпни цветове в допълнение към или вместо група, тогава има таблици за изключения. Групата на таблица вече е по подразбиране цветове (ако има такива):

    model [model] has default color group [group]
    group [group] has color [color]
    model [model] is exceptionally available in color [color]
    model [model] is exceptionally unavailable in color [color]
    

    След това таблиците с изключения съответно се обединяват с и MINUSED/EXCEPTed от JOIN-plus-PROJECT/SELECT, за да се даде първата таблица:

    SELECT group, color FROM model_default NATURAL JOIN group_colour
    EXCEPT SELECT * FROM model_unavailable
    UNION SELECT * FROM model_available
    

„Редундантност“ не е за стойности, които се появяват на множество места. Става дума за множество редове, посочващи едно и също нещо за приложението.

Всяка таблица (и израз на заявка) има асоцииран шаблон на израза за попълване (наименован-) (известен още като предикат). Редовете, които правят вярно твърдение, влизат в таблицата. Ако имате два независими предиката, тогава имате нужда от две таблици. Съответните стойности се намират в редовете на всяка от тях.

Повторните редове, които правят изявления за приложението, вижте това. (И потърсете другите ми отговори относно „изявление“ или „критерий“.) Нормализирането помага, защото замества таблици, чиито редове съдържат неща от формата „... И ...“ с други таблици, които посочват „... "отделно. Вижте това и това.

Ако споделяте групи и използвате само една таблица с две колони за модел и цвят, тогава нейният предикат е:

FOR SOME group
    model [model] comes in the colors of group [group]
AND group [group] has color [color]

Така че вторият куршум премахва едно "И" от този предикат, т.е. източника на "многозначна зависимост". В противен случай, ако промените групата на модела или цветовете на групата, тогава трябва едновременно последователно да променяте няколко реда. (Смисълът е да се намалят грешките и сложността от излишък, а не да се пести място.)

Ако не искате да повтаряте низовете по причини (зависими) от внедряването (заемано място или скорост на операциите за сметка на повече обединения) след това добавете таблица с идентификатори на имена и низове и заменете старите си колони с имена и стойности с колони и стойности на id. (Това не е нормализиране, това усложнява вашата схема в името на компромисите при оптимизиране на данните, зависими от внедряването. И вие трябва да демонстрирате това е необходимо и работи.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ред на PostgreSQL array_agg

  2. PG::ConnectionBad:fe_sendauth:не е предоставена парола

  3. Postgres/JSON - актуализиране на всички елементи на масива

  4. PGError:ГРЕШКА:агрегатите не са разрешени в клаузата WHERE на AR заявка на обект и неговите has_many обекти

  5. Използвайки psql как да изброя разширения, инсталирани в база данни?