2012-03-30 30 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

相关问题