Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.09;
Скачать: CL | DM;

Вниз

Опять SQL:   Найти похожие ветки 

 
Undert ©   (2003-12-17 12:00) [0]

Раз никто не понял чего я хотел в прошлом вопросе, выкладываю то, что вобще надо и что есть:
1. Даны таблицы
Разделы
Пользователи
Доступы
События
События пользователя

Разделы - Id, Название
Пользователи - Id, Имя (дофига)
Доступы - Id, Пользовательский Id, Id раздела
События - Id, Название, Раздел
События пользователяID - Id, Просмотрен

События ведутся одной большой таблицей. Фишка в том, что пользователь должен узнать появились ли новые события в событийной таблице, причём, они появились для него в том случае, если они произошли в доступном ему разделе.

Сейчас это реализовано так: перебераю все события (что и даёт офигенный тормоз системе), смотрю, если оно не присутствует в пользовательской таблице событий и пользователь имеет доступ к данному событию, то говорю, что есть изменения. Как это все оптимизировать ? (Таблицы доступов, пользователей, разделов не меняемые, остальное можно переделать ...)


 
Undert ©   (2003-12-17 12:00) [1]

P.S.События пользователяID - Id, Просмотрен, Id события


 
JibSkeart ©   (2003-12-17 12:01) [2]

ты покажи свой запрос сперва
а мы уж сдесь что нибудь придумаем :)


 
Undert ©   (2003-12-17 12:03) [3]

No problema:

function log_event_check4new($userid) {
$query = ("SELECT * FROM events");
$result = mysql_query($query);
$flag = false;
while ($row = mysql_fetch_array($result)) {
if (($userid==$row[uid])||(log_event_check4hide($userid,$row[ID]))) {continue;};
if (!check4permit($row[reserved2],$userid)) {continue;};
$IsNew = log_event_check4read($userid, $row[ID]);
if (!$IsNew) {$flag = true;break;};
}; //while
return $flag;
}; //func


 
Undert ©   (2003-12-17 12:03) [4]

No problema:

function log_event_check4new($userid) {
$query = ("SELECT * FROM events");
$result = mysql_query($query);
$flag = false;
while ($row = mysql_fetch_array($result)) {
if (($userid==$row[uid])||(log_event_check4hide($userid,$row[ID]))) {continue;};
if (!check4permit($row[reserved2],$userid)) {continue;};
$IsNew = log_event_check4read($userid, $row[ID]);
if (!$IsNew) {$flag = true;break;};
}; //while
return $flag;
}; //func


 
Undert ©   (2003-12-17 12:04) [5]

function check4permit($pid,$userid) {
if (user_status($userid)==0) {$wwr = true;} else {
$qr = ("SELECT * FROM access WHERE uid=$userid");
$qrr = mysql_query($qr);
if (mysql_numrows($qrr)<1) {return false;};
$wwr = false;
while ($qrow=mysql_fetch_array($qrr)) {
$parid = $qrow[tid]; // Если $pid находится в $parid, то может ...
if ($pid==$parid) {$wwr = true;break;};
$is = perm_tlist($qrow[tid],$pid);
if ($is) {$wwr = true;break;};
}; //whilein
}; //if
return $wwr;
}; //func


 
Undert ©   (2003-12-17 12:04) [6]

function log_event_check4read($userid, $eid) {
log_event_create_table($userid);
$r = mysql_query ("select * from usr$userid where eid=$eid");
$rn = mysql_numrows ($r);
if ($rn<1) {
return false;
} else {
return true;
};
}; //func

function log_event_check4hide($userid, $eid) {
log_event_create_table($userid);
$r = mysql_query ("select * from usr$userid where eid=$eid");
$res = false;
while ($row = mysql_fetch_array($r)) {
if ($row[resered]=="1") {$flag = true;break;};
}; //while
return $res;
}; //func

function log_event_visible($userid, $eid) {
log_event_create_table($userid);
$r = mysql_query ("select * from usr$userid where eid=$eid");
$visible = true;
while ($row = mysql_fetch_array($r)) {
if ($row[reserved]=="1") {$visible = false;};
}; //while
return $visible;
}; //func


 
Sandman25 ©   (2003-12-17 12:04) [7]

> Как это все оптимизировать ?

При появлении события устанавливать флаг в таблице пользователей для всех пользователей, у которых есть доступ к данному событию.
Если событий бывает очень много, то этого недостаточно - надо будет завести еще одну таблицу (user_id, event_id) и при появлении события добавлять в нее записи, при просмотре пользователем удалять запись.


 
JibSkeart ©   (2003-12-17 12:07) [8]

или просто ставить ключик
при просмотре которого он меняется с 1 допустим на 0


 
Undert ©   (2003-12-17 12:21) [9]


> Если событий бывает очень много, то этого недостаточно -
> надо будет завести еще одну таблицу (user_id, event_id)
> и при появлении события добавлять в нее записи, при просмотре
> пользователем удалять запись.


А если у нас 1000 пользователей, то для каждого пользователя пять же смотреть имеет ли он доступ к данному разделу, а потом добавлять в эту таблицу - тормоза тоже будут...


 
Sandman25 ©   (2003-12-17 12:32) [10]

[9] Undert © (17.12.03 12:21)

Давайте вместе подумаем.
1) Значит, надо, чтобы проверка наличия новых событий для пользователя проходила быстро - значит, нужен доступ по user_id.
2)Но нужно, чтобы при новом событии не было добавления многих записей - значит, не нужно записывать user_id.
3)Получаем противоречие между 1 и 2. Выбирайте, что более важно - быстрый доступ к непросмотренным событиям или быстрая регистрация новых событий. Когда выберете, легко найдете правильное решение.


 
Undert ©   (2003-12-17 13:44) [11]

А вот и фишка: добавил я нового пользователя ... а ему может надо посмотреть на изменения, которые были до его регистрации в системе... ? Что тогда?


 
Sandman25 ©   (2003-12-17 13:51) [12]

[11] Undert © (17.12.03 13:44)

Это уже технические детали. Можно либо при добавлении пользователя добавлять в таблицу все нужные прошедшие события, либо пользователю установить флаг для просмотра всех событий. Сначала надо в принципе определиться, что оптимизировать.


 
Undert ©   (2003-12-17 14:05) [13]

Главное что бы не тормзило =)



Страницы: 1 вся ветка

Текущий архив: 2004.01.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
1-25414
serg128
2003-12-24 13:13
2004.01.09
Как заблокировать в TDateEdit (из RX) даты, ниже указанной?


1-25415
Byte
2003-12-24 14:39
2004.01.09
Как обратиться к


1-25435
Фагот
2003-12-22 11:37
2004.01.09
Простой ComboBox


4-25665
Скал
2003-11-05 18:30
2004.01.09
регионы RGN


14-25601
Soft
2003-12-12 02:42
2004.01.09
---|Ветка была без названия|---