Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];

Вниз

Опять 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.01 c
3-25219
Бармаглот
2003-12-11 14:04
2004.01.09
Можно ли с помощью ADO делать клиент-серверну БД?


9-25172
vaskin
2003-06-23 18:14
2004.01.09
Глюк


4-25651
Колян_К
2003-11-06 12:14
2004.01.09
Что делает mouse.destroy;


14-25600
mm0
2003-12-16 18:34
2004.01.09
Русские идут...возможно скоро и АМД и ИНТЕЛ уйдут на покой!!!!


6-25476
Anarki
2003-11-07 23:58
2004.01.09
Проблема с idSMTP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский