Skip to content

Category: programmingSyndicate content

C, PHP, VB, .NET

Задачата е от 13.06.2015 г. Да се създаде база от данни, в която да се пази следната информация:

 

C, PHP, VB, .NET

 FEDERATED таблици в MySQL

   от C, PHP, VB, .NET


Представете си, че имаме две различни системи, които работят с различни бази от данни, но желаем част от информацията в тези бази от данни да бъде споделена. Например имаме чат и форум – искаме когато някой се регистрира в чата, да бъде регистриран автоматично и във форума (и обратно). Тоест таблиците на двете бази от данни в по-голямата си част са различни, но една от тях – таблицата Users – трябва да бъде споделена между двете бази от данни.

 

C, PHP, VB, .NET

 Регулярни изрази в MySQL

   от C, PHP, VB, .NET


Имаме таблица, в която ще съхраняваме потребителски имена и пароли. Искаме да направим така, че СУБД да валидира данните, които се въвеждат в базата от данни. Например искаме имената да са съставени само от малки букви и цифри, от 4 до 32 символа, а паролите да са от 6 до 64 символа, като задължително има поне една малка, поне една главна буква и поне една цифра. Дадената таблица е следната:

CREATE TABLE users(
  id SERIAL PRIMARY KEY,
  user VARCHAR(32) NOT NULL UNIQUE,
  pass VARCHAR(64) NOT NULL
);

Лесно можем да гарантираме чрез тригери, че в потребителското име няма да има главни букви, ако просто ги превръщаме винаги в малки:

CREATE TRIGGER usernameCheck
BEFORE INSERT ON users FOR EACH ROW
BEGIN
  SET NEW.user = LOWER(NEW.user);
END;

Аналогично трябва да направим тригер за UPDATE. Дължините също не са проблем. Вътре в тригера добавяме условие:

 

C, PHP, VB, .NET

Задачата е дадена за заминаващите на бригада през 2015 г. Задачата от основното второ контролно през 2015 г. ще бъде формулирана в същия дух.

ФКСУ разполага с три хранилища за стари книжни тела:

  • Дипломните работи се съхраняват 5 години;
  • Курсовите проекти се съхраняват 3 години;
  • Изпитните работи се пазят 5 години.

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

  • Име, фалимилия и факултетен номер на студент, който ги е предал;
  • Име, фалимия и длъжност на преподавателя/ите, който ги е проверил (за дипломните работи е комисия от няколко преподавателя, а за другите е само един);
  • Дата, на която въпросния документ е внесен в хранилището;
  • Номер на хранилището – 1, 2 или 3;
  • Получена оценка от 2 до 6.

Допълнително се съхранява и следната информация:

 

C, PHP, VB, .NET

Изтеглете списъка от тук. Средният успех е над 4 – добре се справихте :)

 

Иван Ванков

За щастие отдавна мина времето когато всяка страница в PHP бе отделен php файл. Днес всяка заявка минава през рутер, който решава кой контролер да извика, което решава доста проблеми, но и създава такива. Основния проблем с рутерите е, че са много бавни. Една от причините е, че ползват регулярни изрази, които сами по себе си са бавни и най-вече не може да се кешират ефективно.

Реално при всяка една заявка рутера трябва да провери всеки един добавен път с регулярен израз докато намери съвпадение. Ако приложението ни има сравнително малко пътища (около 30) времето за намиране не е толкова голям фактор, но при приложения със 100 и повече пътя нещата не са добре.

 

C, PHP, VB, .NET

 Релационно деление с MySQL

   от C, PHP, VB, .NET


Вече знаете за Декартовото произведение на таблици и как то се осъществява с JOIN операция без ON условие. Това е случаят, когато всеки елемент от едната релация се свърже с всеки елемент от другата. Бележи се с C = A x B. Операцията „релационно деление“ e обратната операция на Декартовото произведение – можем да кажем, че A = C ÷ B, както и B = C ÷ A.

Нека вземем един пример – имаме списък със студенти, имаме списък с учебни предмети и имаме списък кой студент каква оценка има по даден учебен предмет:

 

Иван Ванков

От няколко дни съм в жесток спор дали Eloquent (ORM-а на Laravel) е неприлично бавен, и накрая реших да пусна реален тест. Постановката е много проста:

  • Laravel5
  • PHP 5.5.9
  • Mysql 5.5.43
  • Ubuntu 14.04.1 64 бита
  • 16GB RAM
  • Intel i7-3770K

В базата има 2 таблици на INODB, които са свързани с FOREIGN KEY. Таблица Post съдържа 100000 записа а таблицата Comments има 250000 записа.

Ако искаме да вземем само даден Post по PRIMARY KEY разликата между ORM и обикновена заявка е минимална. Проблема идва когато искаме да вземем последните няколко поста с техните коментари. Стандартния начин за това е използвайки JOIN

 

C, PHP, VB, .NET

На представената ER диаграма е показан фрагмент от база от данни за лечебните процедури, които се прилагат върху пациентите в клиника. За всеки пациент (Patient) се пази EГН и име. За леченията (Threatment) пазим уникален идентификационен номер и цена. За докторите (Doctor) пазим уникален идентификационен номер и име. Всяка лечебна процедура (Procedure) е извършена в точно определено време и в точно определен номер на стая.

er-var2

 

C, PHP, VB, .NET

На представената ER диаграма е моделирана база от данни за прожекциите на филми в различни кина. Всяко кино (Theater, за които пазим уникален номер, уникални име и град в който се намира) има по няколко зали (Screen, за които пазим номер на залата и тип – един от три възможни: normal, deluxe и VIP), които правят прожекции (Show, за които пазим време на излъчване на прожекциите и брой на зрители, които са си закупили билети) на определени филми (Movie, за които пазим уникален номер, уникално име, година и държава, в която са снимани). Специално отбелязваме, че номера на зала (screen.no) НЕ е първичен ключ – този номер отбелязва зала 1, 2, 3 и т.н. във всяко кино и не е уникален идентификатор за зала в системата.

er1