O
omaliesschen
Gast
Hi,
ich schreib gerade eine Chatanwendung welche die klassische PM Funktion ablösen soll.
Dabei gibt es eine Tabelle in der unter anderem die chat_id gespeichert wird.
Schickt ein Nutzer einem anderen eine Nachricht und eröffnet damit einen neuen Chatverlauf werden zwei Reihen eingefügt die weitestgehend identisch sind. Eine gehört dem Sender und eine dem Empfänger.
Löscht der Empfänger die Konversation wird "seine" Zeile gelöscht. Löscht der Sender die Konversation wird auch "seine" Zeile gelöscht.
Die Nachrichten werden in einer anderen Tabelle abgelegt.
Wie könnte man entweder die Tabelle gestalten (indexes) oder das Konzet selbst, um Full Table Lookups zu vermeiden?
Mir kam schon der Gedanke eine Tabelle zu erstellen mit primary key auf die Nutzer id und einer Spalte mit allen chat_ids separiert durch Kommas aber dass ist wohl noch schlechter als die aktuelle Lösung?
ich schreib gerade eine Chatanwendung welche die klassische PM Funktion ablösen soll.
Dabei gibt es eine Tabelle in der unter anderem die chat_id gespeichert wird.
Schickt ein Nutzer einem anderen eine Nachricht und eröffnet damit einen neuen Chatverlauf werden zwei Reihen eingefügt die weitestgehend identisch sind. Eine gehört dem Sender und eine dem Empfänger.
Löscht der Empfänger die Konversation wird "seine" Zeile gelöscht. Löscht der Sender die Konversation wird auch "seine" Zeile gelöscht.
Die Nachrichten werden in einer anderen Tabelle abgelegt.
Wie könnte man entweder die Tabelle gestalten (indexes) oder das Konzet selbst, um Full Table Lookups zu vermeiden?
Code:
CREATE TABLE IF NOT EXISTS `user_chat_parent_nodes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`chat_id` int(32) NOT NULL,
`owner_id` int(21) unsigned NOT NULL DEFAULT '0',
`partner_id` int(8) unsigned NOT NULL DEFAULT '0',
`recipient_deleted` tinyint(1) NOT NULL DEFAULT '0',
`sender_deleted` tinyint(1) NOT NULL DEFAULT '0',
`recipient_new` tinyint(1) unsigned NOT NULL DEFAULT '1',
`sender_new` tinyint(1) unsigned NOT NULL DEFAULT '1',
`last_update` int(21) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=45 ;
INSERT INTO `user_chat_parent_nodes` (`id`, `chat_id`, `owner_id`, `partner_id`, `recipient_deleted`, `sender_deleted`, `recipient_new`, `sender_new`, `last_update`) VALUES
(35, 2, 1, 7, 0, 0, 1, 1, 1364563504),
(36, 2, 7, 1, 0, 0, 1, 1, 1364563504),
(37, 3, 1, 7, 0, 0, 1, 1, 1364563504),
(39, 3, 7, 1, 0, 0, 1, 1, 1364563504);
Code:
$sth = $dbh->prepare('SELECT z.chat_id, z.partner_id, z.last_update, z.recipient_new, a.a_name, a.avatar
FROM user_chat_parent_nodes z
LEFT OUTER JOIN authors a
ON a.id = z.partner_id
WHERE z.owner_id = ?
AND z.recipient_deleted = 0
ORDER BY z.last_update
DESC');
$sth->execute(array($user_id));
foreach ($sth as $r) {
$prc_chat_list[] = array(
'chat_id' => $r[0],
'chat_partner_id' => $r[1],
'chat_last_action' => get_time_ago((int)$r[2]),
'chat_new_msg' => $r[3],
'chat_partner_name' => count($r[4]) > 25 ? san(substr($r[4]), 0 ,25).'[...]' : san($r[4]),
'chat_partner_avatar' => san($r[5])
);
}
Mir kam schon der Gedanke eine Tabelle zu erstellen mit primary key auf die Nutzer id und einer Spalte mit allen chat_ids separiert durch Kommas aber dass ist wohl noch schlechter als die aktuelle Lösung?
Zuletzt bearbeitet:
