unfortunately I can't do a live SELECT COUNT(...) statement. That's why
I have the redundant counts saved in the folder record.
There are many folders with lot's of messages, some beyond 200k. MySQL
InnoDB counts are to slow...
Regards,
Moritz
Benjamin Eberlei schrieb:
> Hey Moritz,
>
> actually it shoudl be very easy to do this with a mapper. you would add the
> derived value as you described as a SELECT count statement while retrieving
> the folder. Then you would have to require the application to create new
> messages through the folder entity like $folder->add($message) and increase
> the counter also to be in a consistent state.
>
> you can see an example of how you define that in a mapper in the proposal use
> case "Article: a second definition".
>
> i cant tell about the row gateway, i seldom use that one :-)
>
> greetings,
> Benjamin
>
> On Wednesday 11 February 2009 23:05:48 Bryce Lohr wrote:
>> With respect to Zend_Db_Mapper, the most likely approach I can think of
>> would be where you'd have "numberOfMessages" as a property of a "Folder"
>> entity object. You would code your logic to calculate the correct value
>> for this property, assign it, and then let the mapper update the DB just
>> as it would with any other property. The catch with this approach is
>> that the logic for keeping up with the count must be entirely within the
>> object model, therefore, any operation which directly updates the
>> database would bypass that. If you really want to guarantee that field
>> stays in sync in the database, you really do need triggers and proper
>> transaction isolation.
>>
>> Regards,
>> Bryce Lohr
>>
>> Moritz Mertinkat wrote:
>>> Hi there,
>>>
>>> I've a question regarding best practices for updating redundant
>>> information without using triggers. I know I could use triggers for
>>> simple tasks, but it's not always an option.
>>>
>>> Let's assume I have folders and messages with each folder having a
>>> numberOfMessages property. Thus, everytime I'm adding or deleting a
>>> message I have to adjust this property (also when moving a message
>>> from one folder to another).
>>>
>>> Currently I'm working with Zend_Db_Table_Row_Abstract derived "value
>>> objects" (Row_Message and Row_Folder) and Zend_Db_Table_Abstract
>>> derived "gateway objects" (Table_Message and Table_Folder).
>>> I'm also using two models called Model_Message and (surprise!)
>>> Model_Folder.
>>>
>>> The message model has methods like
>>> - add(array $data) : void
>>> - delete($primaryKey) : void
>>> - get($primaryKey) : Message_Row
>>> - move(Row_Message $message, $folderId) : void
>>> - moveToSpam(Row_Message $message) : void
>>>
>>> Now the question is: where should I update the folder's message count?
>>>
>>> First I implemented it in Model_Message's add(), delete() and move()
>>> methods, but that seemed to be a bit naive, because one could simple
>>> do something like
>>> $message = $messageModel->get(17);
>>> $message->folder_id = 3;
>>> $message->save();
>>> and nothing got updated in the old and new folder records.
>>>
>>> So I moved the count update stuff to Row_Message using _postDelete(),
>>> _postInsert() and _postUpdate() methods and doing some plain vanilla
>>> queries to update the folder record(s). (I could've used Row_Folder,
>>> but that would be a bit like using a sledgehammer to crack a nut, I
>>> thought).
>>>
>>> What do you think about this approach? Is it "common"?
>>>
>>> And what about this issue regarding the proposed Zend_Db_Mapper?
>>> http://framework.zend.com/wiki/display/ZFPROP/Zend_Db_Mapper+-+Benjamin+E
>>> berlei
>>>
>>> Will there be a possibility to achieve things like these?
>>>
>>> Looking forward to your feedback :-)
>>>
>>> Best regards,
>>> Moritz
>
没有评论:
发表评论