Форум: "Потрепаться";
Текущий архив: 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