Проблема отношений в Cakephp. Как получить данные?

Я пытаюсь сделать функциональность сообщений похожей на facebook. Просто сообщение, а не facebook. Краткое описание похоже на это.

1) Есть несколько пользователей (таблица пользователей) 2) Один человек может отправить сообщение одному или нескольким людям. 3) На одно и то же сообщение может быть несколько ответов. 4) Если его отправить нескольким людям. Все могут ответить, и это показано всем им.

Используемые таблицы

таблица сообщений

id
timestamp
sender_id
subject
message
due_date
urgent_flag
open_flag
reply_id

message_user (таблица)

id
timestamp
message_id
receiver_id
read_flag

Отношения CakePHP следующие:

Модель сообщения

var $hasMany = array(
        'MessageUser' => array(
            'className'     => 'MessageUser',
            'foreignKey'    => 'message_id',    
                )
    );  
var $belongsTo = array (
    'User' => array (
        'className' =>  'User',
        'foreignKey' => 'sender_id',
    )
);
var $hasAndBelongsTo=array(
    'Message' => array (
        'className' => 'Message',
        'foreignKey' => 'reply_id',
       )
);

Модель MessageUser

var $belongsTo = array (
    'User' => array (
        'className' =>  'User',
        'foreignKey' => 'receiver_id',
    ),
    'Message' => array (
        'className' =>  'Message',
        'foreignKey' => 'message_id'

    )
);

Вопросы :

1) Верен ли мой подход? Или схему базы данных нужно пересмотреть. 2) Если да, как мне получить данные для папки "Входящие"? Это немного сложно, так как я хочу показать разговор для тех сообщений, которые мне прислали люди.

Например, пользователь 1 отправляет сообщение пользователю 2. Пользователь 2 добавляет 2 ответа на одно и то же. Тогда в почтовом ящике пользователя 1 должно отображаться только 1 сообщение. а когда открываю. он также покажет предыдущие сообщения .. (это похоже на facebook)

Еще одна проблема, которую я вижу здесь: как удалить сообщения? Предположим, что пользователь 1 удаляет сообщение, которое не должно отображаться в его почтовом ящике. но пользователь 2 может видеть весь разговор, который у него был.


person Community    schedule 22.02.2010    source источник
comment
Если вы ожидаете, что многопотоковые ответы будут обычным явлением, я бы предложил использовать поведение дерева для таблицы, так как вам будет проще получить полный поток.   -  person Travis Leleu    schedule 22.02.2010
comment
можешь объяснить это подробно..   -  person    schedule 23.02.2010


Ответы (1)


WRT вашей схемы, я бы только установил отношения в том направлении, в котором вам нужно получить к ним доступ. Таким образом, если вам не нужно когда-либо обращаться к Пользователю, получившему сообщение, не связывайте сообщения обратно с пользователями. Это может создать некоторые проблемы с рекурсией, когда ваши модели будут автоматически извлекать слишком много данных, потому что у вас есть циклический цикл (User hasMany Message, Message HasMany User и т. д.). На самом деле это то, что представляет собой отношение HABTM, поэтому используйте его вместо hasMany ( если вы хотите, чтобы это были двунаправленные отношения).

В моем комментарии упоминалось поведение дерева. Проще говоря, он позволяет легко хранить иерархические данные в таблице реляционной базы данных. Я не буду повторять руководство, но загляните на http://book.cakephp.org/view/91/Tree и погуглите примеры. Я почти уверен, что это то, что вы хотите использовать для цепочек ответов.

Еще одно предостережение: если вы собираетесь использовать это с серьезной пользовательской базой, запустите несколько нагрузочных тестов в этой части вашей базы данных. Я не уверен, насколько хорошо TreeBehavior будет работать с миллионами строк на дешевом сервере.

person Travis Leleu    schedule 24.02.2010