Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 20:43 07.06.24 
Компютри и Интернет
   >> Бази данни
*Кратък преглед

Тема Професионален спор за NULL и Foreign Key (mySQL)нови  
Автор Dakota (гол на деня)
Публикувано09.10.02 16:39



С един колега спорихме за това, трябва ли Foreign Keys в mysql (знам, че в mysql няма такова животно, става дума за полето, по което се join-ва) да бъдат оставяни NULL или да се слагат на NOT NULL? Моята позиция беше за NOT NULL и default '0'...като аргументите ми бяха предимно взети от mysql reference глава 5.4.2, а именно:

"Declare columns to be NOT NULL if possible. It makes everything faster and you save one bit per column. Note that if you really need NULL in your application you should definitely use it. Just avoid having it on all columns by default."

Ако някой може да ми даде подробности за това, защо е faster и кога наистина се налага едно поле да е NULL? Ако от едната страна то е NOT NULL като Primary Key, защо от другата страна да е NULL?

От друга страна, наистина има join заявки, при които искам като резултат да ми бъде върнат NULL, а не, че 100>0 примерно...т.е. в контекста на join, NOT NULL може да бъде и опасно.

В тази връзка искам да зачекна и въпроса за това, трябва ли ВСИЧКИ primery keys на базата да са от един тип? Примерно ако в едната таблица ми трябва BIGINT, каква е причината, да сложа BIGINT на таблица, в която ще имам най-много 3 стойности?! Позовавам се отново на гореспоменатата глава...и по-специално:

"One of the most basic optimization is to get your data (and indexes) to take as little space on the disk (and in memory) as possible...

...Use the most efficient (smallest) types possible. MySQL has many specialized types that save disk space and memory.
Use the smaller integer types if possible to get smaller tables. For example, MEDIUMINT is often better than INT.
"


"Да живееш - значи да се променяш." - Анатол Франс


Тема Re: Професионален спор за NULL и Foreign Key (mySQL)нови [re: Dakota]  
Автор voyager (бастун)
Публикувано09.10.02 17:29



Принципно защо като няма НУЛЛ е по-бързо в подробности може да каже някой който познава много добре МуСКЛ. Мисля, че има такъв в клуба . Колкото това дали е така, опита показва, че е истина. Честно казано, никога не използвам полета с нулл за каквото и да е. Винаги се намира начин да представиш НУЛЛ с някаква стойност /*не задължително нула*/.
Колкото до еднаквите типове на полетата праймъри кейс, вероятно причината е в аритмечиното изравняване на типовете, което би трябвало да се прави, както се прави в процедурните езици. Мда. Ама тва са една кофа мнения само, нищо повече



Тема Re: Професионален спор за NULL и Foreign Key (mySQL)нови [re: Dakota]  
Автор NDeu (минаващ)
Публикувано09.10.02 19:23



1.Без да конкретизирам за MySQL (не го познавам ) по принцип няма смисъл Foreign Key да е Null, защото той трябва да сочи към съществуващ запис в детайла.
2. За скоростта - хората са го казали ясно. Бих добавил само, че това е вярно не само за MySQL.
3.Без да конкретизирам за MySQL (не го познавам ) по принцип няма ограничение (почти) какъв тип ти е Primary Key (ако щеш и VarChar), но разбира се трябва да има идентичност със съответния Foreign Key



Тема Re: Професионален спор за NULL и Foreign Key (mySQL)нови [re: Dakota]  
Автор RepeatableRead (transactional)
Публикувано09.10.02 19:46



Ако логиката на данните го изисква може Foreign-key да се сложи NULL, но тогава ще се налага да се правят външни join-ове. Зависи какво се изисква и какво трябва да се постигне. Иначе NULL понякога е много удобно. Но все пак трябва да се внимва.



Тема Re: Професионален ? спор :)нови [re: Dakota]  
Автор salle (Един такъв)
Публикувано10.10.02 12:44



С един колега спорихме за това, трябва ли ...

Непрофесионално - няма такова мещо като трябва изобщо.

Професионално би било да попиташ:
Може ли? Ако може какъв е смисъла? Кога би могло това да върши работа? Какви проблеми може да създаде? А ето в този конкретен случай какви са плюсовете и минусите?

Съвсем общо правило (не конкретно за MySQL) - представи си, че ти си сървъра. Ако знаеш че може да бъде и NULL - трябва да правиш една проверка повече. А и трябва някъде да пазиш тази информация.

Много внимателно обаче обсъдете с твоя колега втората част от текста който си цитирал:

"Note that if you really need NULL in your application you should definitely use it. Just avoid having it on all columns by default."

Да не истанеш с впечатлението, че е по-добре да не използваш NULL.

> В тази връзка искам да зачекна и въпроса за това, трябва ли ВСИЧКИ primery keys на базата да са от един тип?

Още по-непрофесионално. Пак думичката трябва. Освен това забравяш, че PK (както и всеки Index) няма тип. Тип имат колоните които са индексирани а това е съвсем друго нещо.

Какъв е типът на следния PK:

g_id INT UNISGNED,
u_name CHAR(16),
ts TIMESTAMP,

PRIMARY KEY(g_id, u_name, ts) ?


Позоваваш се на цитирания текст изцяло извън контекста.

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

Има друго правило, че когато правиш Join препоръчително е колоните които участват в Join условието да са от еднакъв тип. В MySQL не е задължително, но работи по-бързо. Логиката е ясна - когато имаш да сравниш 100 000 стойности ако типа е различен имаш 100 000 преобразувания на тип.

Това правило обаче веднага влиза в противоречие с горното макар и в някои частни случаи.

А това е едно универсално явление - почти винаги и навсякъде оптимизираш

Обем срещу Скорост.
Или обемисто и бързо или компактно но бавно.

Тъй че Dakota - профилирайте си професионализизацията

така де ... работете заедно по един проект и спорете, че ето те тука те ако отрежем един бит ще помогне....

оставете думичката трябва за изрази като
Трябва да изпием по бира



Тема Re: Професионален ? спор :)нови [re: salle]  
Автор Dakota (гол на деня)
Публикувано10.10.02 13:51



Изразът трябва не го измислих аз, просто цялата фраза която чух беше:

"Прието е всички primary да са от един тип"

И на моя въпрос "Защо?", беше отгорено с: "Повярвай ми, така е...така е прави"

И именно затова питам, защо трябва?!

Разбира се, това, по което се join-ва е от един тип, въпросът ми беше, има ли наистина конвенция auto_increment полетата (те поне са по едно на таблица ) да бъдат от един тип във всички таблици? И ако да - защо?!

Относно NULL, въпросът ми е принципен...т.е. наистина ли е въпрос на личен избор в конкретния случай, или е едното е по-добро от другото...или с други думи: "Има ли поне една наистина добра причина да слагам FK NULL, освен за лична информация?"

И при бирата няма думичката трябва, там си е по подразбиране...

"Да живееш - значи да се променяш." - Анатол Франс


Тема offtopicнови [re: salle]  
Автор Xypodilec (тъп юзър)
Публикувано10.10.02 14:52



ракията за нищо я нямаш май



Тема Re: Професионален ? спор :) [re: Dakota]  
Автор phpGuruАдминистратор (непознат)
Публикувано10.10.02 18:53



тъп пример и абсолютно неразбран може би ;-))

CREATE TABLE colors (
id serial NOT NULL PRIMARY KEY,
name varchar(64) NOT NULL
);

INSERT INTO color VALUES ('червен')
-- и други цветове

и сега един вариант

CREATE TABLE cars (
id serial NOT NULL primary key,
name varchar(128) NOT NULL,
color int4 NULL REFERENCES colors
);

и друг

CREATE TABLE car (
id serial NOT NULL primary key,
name varchar(128) NOT NULL,
color int4 NOT NULL REFERENCES color
);

проблема е винаги ли знаеш цвета на колата,

първият вариант допуска такова незнание и при евентуален JOIN то ще бъде пропуснат (тук съвсем я окалпах, ама ме цепи глава и немога да се връщам), (ако искаш да фанеш и неопределените цветове ползваш OUTER JOIN)

вторият вариант ако искаш да има цвят неопределен си вмъкваш в първата таблица ред
INSERT INTO color VALUES ('неопределен')
и тогава обаче при JOIN винаги ще се проверява и в таблицата color и приложението трябва да прави то проверка, дали това е неопределен

аз харесвам първият вариант когато може да не се знае цвета и вторият вариант когато цвета е задължителен
________________________

ако е адски неясно друг път ще пояснявам кво съм искал да кажа



Тема Re: #define biraнови [re: Xypodilec]  
Автор salle (Един такъв)
Публикувано11.10.02 13:05



Ракията ми седи във фризера - т.е. винаги има бутилка там. Като я извадиш при -18 е супер

"Бира" е размит термин - означава "каквото пиеш"

Май наистина напоследък по-често пия бира обаче.

Хайде наздраве




*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.