2012-03-30 65 views
1

我有一個網絡應用程序內置Django + Python與網絡服務交互(編寫在JAVA)。如何在網站中存儲所有用戶活動..?

現在所有的數據庫管理部分由網絡服務,即所有CRUD操作實際數據庫是由網絡服務所做的一切。現在


我必須賽道上我的網站做了所有用戶活動一些日誌表

一樣,如果用戶發佈了一個新的文章,然後新建一行到文章表通過網絡服務和並排,我需要添加一個新行日誌表,像「用戶:拉曼已經發布了一個新的文章(有ID,名稱等)

我必須爲我的數據庫像所有的對象都是這樣做‘文章’,‘媒體’,‘評論’等


注意:我使用PostgreSQL


那麼,什麼是實現這一目標的最好的辦法 ..? (我應該做它PostgreSQL的 OR JAVA ?? ..而如何??)

回答

1

所以,你必須UI <-> Web Services <-> DB

由於Web服務談話到數據庫和Web服務包含業務邏輯(即我猜你驗證的東西在那裏,創建你的查詢和執行它們),然後「登錄」活動的最佳地點是服務本身。

IMO,logging PostgreSQL事務是不同的事情。這與記錄'用戶活動'不一樣。

編輯:這仍然意味着你創建'日誌'數據庫模式並將它們寫入數據庫。

二編輯:在UI追趕日誌值得事件,然後記錄他們從那裏可能不是最好的主意無論是。如果您決定更換UI,則必須重寫日誌記錄,或者爲例如移動設備或其他設備編寫替代UI。

+0

我想知道我們cud在'PostgreSQL'中寫了'Triggers',當一個新行插入到Article,Media,Comments表等等時,它會填充Log表。這是個好主意? – 2012-03-30 15:07:22

+0

取決於。如果將來您有一種情況,用戶可以上傳包含媒體的文章(可能,對嗎?),並且這是在單個Web服務調用中處理的? – ArjunShankar 2012-03-30 15:13:13

+0

真.. .. ..我會看到它.. !! ..實際上服務都是完整的.. !! ..我thot可能是我沒有把一個額外的代碼..通常thanx ..! ! – 2012-03-30 15:40:07

0

在日誌表中,可以有不同的欄目,包括:

  • user_id(該做的動作)
  • activity_type(活動類型的用戶,如viewcommented_on
  • object_id(實際的對象,它涉及,如文章或媒體)
  • object_type(對象的類型;這可以在以後使用,結合object_id查找數據庫中的對象)

這樣,您就可以跟蹤用戶完成所有操作。無論什麼時候發生你想跟蹤的事情,你都需要更新這張表。

+0

我在問什麼..最好的解決方案來更新這張表.. ?? ...我應該在'PostGreSQL'或'JAVA' .. .. ..以及如何..? – 2012-03-30 12:08:26

+0

這樣的表格相當不錯,但即使小型網站擁有5萬名會員,它也可能會非常快速地增長。如果只有這個表增長速度比whol數據庫快10倍,我們如何維護它呢? – brsbilgic 2014-08-07 15:11:30

0

無論何時我們必須這樣做,我們都會覆蓋每個模型和可能的操作的信號。

https://docs.djangoproject.com/en/dev/topics/signals/

你可以有信號做你想做的,從注入一些HTML到頁面中,使您在數據庫中的條目。它們是學習使用的極好工具。

+0

我們在Django中沒有模型..我提到我們通過Web服務管理數據庫.. !! – 2012-03-30 15:10:01

+0

你爲什麼要使用Django,但不使用模型? – kcunning 2012-03-30 15:25:05

+0

Django是一個'網頁框架'..我knw模型是Django強大的功能,但不是強制.. .. – 2012-03-30 15:37:16

1

對於DB本身內部審計表,看看在PL/pgSQL Trigger Audit Example

這將記錄每一個INSERT,UPDATE,DELETE到另一個表。

+0

thanx ..我會看看它,看看它是否做得很好..! – 2012-03-30 15:12:02

-1

我用django-audit-log,我很滿意。

Django審計日誌可以跟蹤多個模型,每個模型都在它自己的附加表中。所有這些表格都非常統一,因此創建一個顯示所有模型數據的SQL視圖應該相當簡單。

這裏是我做了什麼,以跟蹤單個模型(「Pauza」):

class Pauza(models.Model): 
    started  = models.TimeField(null=True, blank=False) 
    ended  = models.TimeField(null=True, blank=True) 
    #... more fields ... 

    audit_log = AuditLog() 

如果你想改變在Django管理展示,您可以創建一個unmanaged model(但這絕不裝置需要):

class PauzaAction(models.Model): 

    started  = models.TimeField(null=True, blank=True) 
    ended  = models.TimeField(null=True, blank=True) 
    #... more fields ... 

    # fields added by Audit Trail: 
    action_id = models.PositiveIntegerField(primary_key=True, default=1, blank=True) 
    action_user = models.ForeignKey(User, null=True, blank=True) 
    action_date = models.DateTimeField(null=True, blank=True) 
    action_type = models.CharField(max_length=31, choices=(('I', 'create'), ('U', 'update'), ('D', 'delete'),), null=True, blank=True) 
    pauza  = models.ForeignKey(Pauza, db_column='id', on_delete=models.DO_NOTHING, default=0, null=True, blank=True) 

    class Meta: 
     db_table = 'testapp_pauzaauditlogentry' 
     managed = False 
     app_label = 'testapp' 

testapp_pauzaauditlogentry自動由django的審計日誌創建的,這僅僅是創建用於從它顯示數據的模型。 這可能是在一些粗魯的防篡改保護拋出一個好主意:

class PauzaAction(models.Model): 

    # ... all like above, plus: 

    def save(self, *args, **kwargs): 
     raise Exception('Permission Denied') 
    def delete(self, *args, **kwargs): 
     raise Exception('Permission Denied') 

正如我所說的,我想你可以創建一個有四個action_場和一個額外的「action_model」字段可能包含VARCHAR一個SQL視圖引用模型本身(可能只是原始表名)。

+0

我不使用Django模型..看我的評論在其他答案..! – 2012-03-31 11:37:37

相關問題