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

Защо, за бога, ще имам_много връзки?

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

Има случаи, в които вграденото поле може да е по-подходящо, но за този въпрос като пример ще използвам случай, който подчертава предимствата на подхода за свързана таблица.

Представете си пример за потребител и публикация за блог.

За вградено решение за публикуване ще имате таблица нещо подобно (psuedocode - те вероятно не са валидни ddl):

create table Users {
id int auto_increment,
name varchar(200)
post text[][],
}

Със свързани таблици бихте направили нещо като

create table Users {
id int auto_increment,
name varchar(200)
}
create table Posts {
id auto_increment,
user_id int,
content text
}

Инструменти за обектно релационно съпоставяне (ORM) :С вградената публикация вие ще пишете кода ръчно, за да добавяте публикации към потребител, да навигирате през съществуващи публикации, да ги валидирате, изтривате и т.н. С дизайна на отделната таблица можете да използвате ActiveRecord (или каквато и да е обектно-релационна система, която искате използват) инструменти за това, които трябва да опростят кода ви.

Гъвкавост :Представете си, че искате да добавите поле за дата към публикацията. Можете да го направите с вградено поле, но ще трябва да напишете код, за да анализирате вашия масив, да потвърдите полетата, да актуализирате съществуващите вградени публикации и т.н. С отделната таблица това е много по-лесно. В допълнение, да приемем, че искате да добавите редактор към вашата система, който одобрява всички публикации. С релационния пример това е лесно. Като пример, за да намерите всички публикации, редактирани от „Боб“ с ActiveRecord, трябва само:

Editor.where(name: 'Bob').posts

За вградената страна ще трябва да напишете код, за да преминете през всеки потребител в базата данни, да анализирате всеки един от техните публикации и да потърсите „Боб“ в полето за редактор.

Ефективност :Представете си, че имате 10 000 потребители със средно по 100 публикации всеки. Сега искате да намерите всички публикации, направени на определена дата. С вграденото поле трябва да преминете през всеки запис, да анализирате целия масив от всички публикации, да извлечете датите и да проверите тази, която искате. Това ще сдъвче процесора и диска i/0. За базата данни можете лесно да индексирате полето за дата и да извадите точните записи, от които се нуждаете, без да анализирате всеки пост от всеки потребител.

Стандарти :Използването на структура от данни, специфична за доставчика, означава, че преместването на вашето приложение в друга база данни може да бъде трудно. Изглежда, че Postgres има богат набор от типове данни, но те не са същите като MySQL, Oracle, SQL Server и т.н. Ако се придържате към стандартните типове данни, ще ви е много по-лесно да сменяте бекенда.

Това са основните проблеми, които виждам отгоре. Направих тази грешка и платих цената за нея, така че освен ако няма супер убедителна причина, направете друго, бих използвал отделната таблица.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да коригирам PG::DuplicatePstatement:ГРЕШКА?

  2. Как да агрегираме съвпадащи двойки в свързани компоненти в Python

  3. Актуализирайте съществуващ ред в базата данни от pandas df

  4. Уникална комбинация в маса

  5. django - обобщаване на специфични ключове за json поле и подреждане по агрегацията