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

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

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

Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема MySQL таблици с релация и оптимизация на INSERT-и?нови  
АвторЧaвдap (Нерегистриран)
Публикувано07.06.05 16:08



Как може да се от оптимизира заявка към MySQL за следната ситуация:
WEB система ползваща MySQL. WEB системата има 4 отделни потребителски интерфейса. На всеки интерфейс може да има съобщение от администратора към потребителите. Дадено съобщение може да се отнася само за един интерфейс, но може да се отнася за два три, дори за всички четири интерфейса. За целта са проектирани следните две бази таблици, между които има релация– user_messages и user_interfaces.
user_messages има в структурата си две полета id- тип int unsigned, уникално, auto_increment и message – тип text. Във всеки ред от тази таблица се съдържа уникален номер на съобщението (полето id) и текста на самото съобщение (полето message).
Другата таблица user_interfaces е изградена от две полета: message_id – тип int unsigned и полето и interface - тип – enum (1,2,3,4). Във всеки ред от тази таблица се съдържа номер на съобщението (полето message_id), стойността на това поле отговаря на даден номер от полето id в таблицата user_messages (чрез това поле се осъществява релацията между двете таблици). В другото поле от таблицата interface се съдържа номера на интерфейса от 1 до 4. Така, ако дадено съобщение важи и за четирите интерфейса в таблицата user_interfaces ще имаме четири записа.
WEB системата на администратора позволява да въвежда съобщения и да избира за кой интерфейс да важат. Скрипта обслужващ тази система първо с един INSERT въвежда съобщението в полето message на таблицата user_messages, a MySQl си генерира автоматично числото в полето id. След това се използва MySQL функцията mysql_insert_id() за да се определи id стойността, след което с извлечената стойност и номерата на дадените интерфейси се въвеждат в таблицата user_interfaces с нов INSERT.
Как може тази задача да се оптимизира – по малко MySQL команди и по-малко време за изпълнение ?
Благодаря




Тема Re: Какво трябва да се оптимизира?нови [re: Чaвдap]  
Автор salle (един такъв)
Публикувано07.06.05 17:34



?



Тема MySQL някакви неща ама каквинови [re: Чaвдap]  
Автор ro6avia (усер френдли)
Публикувано07.06.05 18:19



както казваше един мй познат :
Излез, формулирай си въпроса правилно и влез отново :-))))

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

П.С. Много по-лесно ще е ако дадеш create table заявките и части от кода, а не да обясняваш в разговорен стил какво правиш !

root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy


Тема Re: Какво трябва да се оптимизира?нови [re: salle]  
АвторЧaвдap (Нерегистриран)
Публикувано07.06.05 20:27



Извинявам се!
Думата в случая не е "оптимизирам", дори подвежда в друга посока.

Въпроса ми е какви са възможностите задачата да се реши по друг начин, който е по-ефективен и по-бърз?

Ето и кода:

CREATE TABLE `user_messages` (
`id` int(11) unsigned NOT NULL auto_increment,
`message` text NOT NULL,
UNIQUE KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;

CREATE TABLE `user_interfaces` (
`message_id` int(11) unsigned NOT NULL,
`interface` enum('1','2','3','4') NOT NULL default '1'
) TYPE=MyISAM;

$message=$_POST["message"];
$interface1=$_ POST["interface1"];
$interface2=$_ POST["interface2"];
$interface3=$_ POST["interface3"];
$interface4=$_ POST["interface4"];


$query=” INSERT INTO `user_messages` ( `id` , `message` ) VALUES ( '', '$message ');”;

$id=mysql_insert_id ();

if ($interface1)
{
INSERT INTO `user_interfaces` ( `message_id` , `interface` ) VALUES ( '$id ', '1');
}
if ($interface2)
{
INSERT INTO `user_interfaces` ( `message_id` , `interface` ) VALUES ( '$id ', '2');
}
if ($interface3)
{
INSERT INTO `user_interfaces` ( `message_id` , `interface` ) VALUES ( '$id ', '3');
}
if ($interface4)
{
INSERT INTO `user_interfaces` ( `message_id` , `interface` ) VALUES ( '$id ', '4');
}



Тема Re: Какво трябва да се оптимизира?нови [re: Чaвдap]  
Автор ro6avia (усер френдли)
Публикувано07.06.05 20:50



в същия вид таблици ... (само се сменя енум-а на интерфейса да е int)

$query=" INSERT INTO `user_messages` ( `id` , `message` ) VALUES ( '', '".addslashes($_POST["message"])."')";

$id=mysql_insert_id ();
$interface=0;
for($i=0; $i<4;$i++){
if (isset($_POST["interface".($i-1)]) && $_POST["interface".($i-1)]==true) $interface += pow(2,$i);
}
$query = "INSERT INTO `user_interfaces` ( `message_id` , `interface` ) VALUES ( '$id ', '$interface') ";

.........
След това селектите трябва да са ти така :
$query = "SELECT from ... where user_interfaces.interface&$interface_na_foruma"


очевидно втората таблица става излишна, и може да вкараш числото още в първата .....

root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy

Редактирано от ro6avia на 07.06.05 20:55.



Тема Re: Какво трябва да се оптимизира?нови [re: ro6avia]  
АвторЧaвдap (Нерегистриран)
Публикувано08.06.05 13:41



Ro6av, хитро решение, но дали е добро ?
До колкот разбирам ти казваш, че за да е ясно дадено съобщение за кой инетрефейс(или група от интерфейси)е валидно може да се представи чрез комбинация от 15 цифри. И така втората таблица отпада,а в първата се добавя едно ново поле, което съдържа едно от 15 цифри-възможности.
До тук добре, но после трябва да се организира код който да превръща от цифрата в номер на интерфеей или всеки интерфейс да знае дали дадената цифра се отнася и за него? Със сигурност това ще стане , но PHP кода ще се увеличи, възможността за грешка също. Едно е сигурно, кода ще стане много сложен.
Но все пак нали релационните бази данни са измислени за да решават някой проблеми .
Хитро решение! Благодаря ти ro6aw



Тема Re: Какво трябва да се оптимизира?нови [re: Чaвдap]  
Автор ro6avia (усер френдли)
Публикувано08.06.05 16:14



Всъщност не си ме разбрал
знака & е за бинарна операция

обяснявам ти го с цифри :
0 -> 0
1 -> 1
10 -> 2
11 -> 3
100 -> 4
101 -> 5
и т.н.
в твоя случай може да имаш максимално записано число 15 (а не 15 цифри)
когато е да кажем 3 при извършване на операцията & резултата е следния :
1 & 5 = 1
2 & 5 = 0
4 & 5 = 1
8 & 5 = 0
или бинарно :
0001 & 0101 -> 1
0010 & 0101 -> 0
0100 & 0101 -> 1
1000 & 0101 -> 0
това ти показва дали дадено число се съдържа в друго в бинарното му представяне (е не можах да го измисля по-мъдро).

Няма НИКАКВА нужда от превръщане на цифрата в интерфейс, а просто се ползва номера на интерфейса като степен на двойката.
В случая :
интерфейс 1 -> 2 на степен 0 = 1
интерфейс 2 -> 2 на степен 1 = 2
интерфейс 3 -> 2 на степен 2 = 4
интерфейс 4 -> 2 на степен 3 = 8

На мен ми е по-лесно като че ли да броя от нула нагоре за това и започвам с 2 на степен нулева, но ако на теб ти е трудно остави основата и увеличи степента с + 1

интерфейс 1 -> 2 на степен 1 = 2
интерфейс 2 -> 2 на степен 2 = 4
интерфейс 3 -> 2 на степен 3 = 8
интерфейс 4 -> 2 на степен 4 = 16
Тогава ще имаш максимална стойност 30 за полето с интерфейси и логиката ще продължи да е същата.

Просто ти трябва проверяваш дали съобщението е за този интерфейс със
полето_за_указване на интерфейса & 2 на степен номера на интерфейса.

И нито кода ще стане сложен, нито ще се увеличи възможноста за грешка. Всеки интерфейс ще си търси нещата с бинарно &.

За релационните бази данни си прав, НО ....
тук има едно голямо НО
защо ти е нова допълнителна таблица ? защо да го караш да чете от две таблици с inner, left или какъвто си искаш join, като както е добре известно числовите операции са едни от най бързите.

Ако искаш ще ти изровя линкове с обяснения за бинарната математика, какво е AND, OR, XOR и какво може да се направи с тях.

root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy


Тема Re: Какво трябва да се оптимизира?нови [re: ro6avia]  
АвторЧaвдap (Нерегистриран)
Публикувано09.06.05 12:15



o.k. Добре е да има повече мнения и повече решения по даден въпрос .
Не разбрах твоятя идея, но ти благодаря за труда да ми я обясниш.
В нашият случай става въпрос за 4 интерфейса, ами ако са 40, а 400? Все пак аз си мисля, че решението с релационни база данни е по-добро.



Тема Re: Какво трябва да се оптимизира?нови [re: Чaвдap]  
Автор NDeu (динозавър)
Публикувано09.06.05 12:52



Ако са до 64, bigint (int64) те устройва. Ако са повече, подобен метод пак е приложим, но е по-добре да търсиш по-RDB решение n:m

Редактирано от NDeu на 09.06.05 12:55.



Тема Re: Какво трябва да се оптимизира?нови [re: Чaвдap]  
Автор ro6avia (усер френдли)
Публикувано09.06.05 13:43



Я ми кажи ти колко си в час с двоичната система ?
Учил ли си някога нещо такова и ако да колко си запомнил ?

Ще ти го обясня още един път:
На всеки интерфейс се слага номер който е степен на 2-та. т.е.
интерфейс 0 е 2^0 = 1
интерфейс 1 е 2^1 = 2
интерфейс 2 е 2^2 = 4
интерфейс 3 е 2^3 = 8
интерфейс 4 е 2^4 = 16
интерфейс 5 е 2^5 = 32
интерфейс 6 е 2^6 = 64
интерфейс 7 е 2^7 = 128
......
В случая със седем интерфейса максималното число което ти трябва е сбора на геометричната прогресия (1,2,4,....,128), която е 2^8-1 = 255
Всяка едно число (n) получено от сбора на ПРОИЗВОЛНИ номера на интерфейси (без повторения), ГАРАНТИРА, че при извършване на следната операция : n&k, където k е номер на интерфейс, ще върне резултат 1 ако k е използвано при сумирането и 0 ако не е използвано.

Което е достатъчен начин да определиш дали за даден интерфейс се налага да покажеш събщение или не!

П.С. в Unix/Linux правата на файловете се описват ПО СЪЩИЯ начин.

root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy



Страници по тази тема: 1 | 2 | >> (покажи всички)
*Кратък преглед
Клуб :  


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

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