2013-06-19 267 views
2

我有一個系統,允許用戶上傳視頻到Youtube,而我保持在我的數據庫中登錄,現在的問題是,我不知道我該如何建模。如何建模登錄數據庫?

使用數據庫的日誌系統(我使用Django的ORM)證明過於冗長,因爲我需要生成格式良好的頁面以允許'manager'用戶查看用戶的活動。

現在我有兩個選擇:

第一:

使用外鍵和一個字段來指示類型。 優點:

  • 簡單的實現

缺點:

  • 額外的作品時,我要查詢日誌

二:

使用繼承將日誌分爲三部分:創建,更新和刪除。 必須存在創建視頻條目才能存在,如果具有刪除日誌,則刪除視頻條目。

優點:

  • 在編程方面

缺點簡單的邏輯:

  • 複雜的模型實現,可能是不靈活的爲未來的擴展。

我不確定哪一個更好?或者我得到這一切的問題錯了嗎?(如已經有這類問題的模式?)

+0

有爲什麼要在數據庫中創建日誌,而不是在日誌文件中原因是什麼?如果您需要報告數據,那麼有很好的工具可以爲您提供日誌文件的實時數據。嘗試Splunk或石墨。 –

+0

日誌是針對客戶端(即「經理」用戶)的,它不是'技術性'的。而且,當用戶查看視頻條目以查看修改歷史記錄時,我希望生成良好的報告頁面。感謝評論,雖然這可能不完全是我在找。 – doomleika

+0

我在第二個選項中沒有看到任何優勢。你能詳細說明你爲什麼這麼想嗎? –

回答

3

例如在第一個變體,你可以爲你的Log模型創建3個額外的QueryManager和使用它們(這將是類似2變體,但不創建3個附加模型)。

它們可以像create_objects,update_objectsdelete_objects或更短(例如create_log)。

下面是例子經理類:

from django.db.models import Manager 

class LogManager(Manager): 
    def __init__(self, type): 
     super(LogManager, self).__init__() 
     # add check of type if you need 
     self._type = type 

    def get_queryset(self): 
     return super(LogManager, self).get_queryset().filter(type=self._type) 

此代碼是僅用於演示(我沒有測試)。

而且在你的模型類,你應該指定3個額外的經理是這樣的:

from django.db.models import Model 

class Log(Model): 
    create_log = LogManager('create') 
    update_log = LogManager('update') 
    delete_log = LogManager('delete') 

或者您可以使用__getattr__方法來獲得適當的經理,但「顯式優於隱式」。

+0

謝謝,我對django/python仍然陌生,不知道我能做到這一點。 – doomleika