我有一个讨论论坛的网站。 所有问题都有唯一的ID,答案也有唯一的ID,其中外键引用问题ID。

我有一个用户登录。使用ajax,我可以发送数据(upvote / downvote,QID / AID,用户名)。但是问题很少。

  1. 每当用户重新登录时,我希望他打开一个问题时,都应显示其先前的赞和反对票。

  2. 用户不能多次投票赞成/拒绝同一问题。 就像他将问题的+1投票赞成一样,他只能将其投票,不能再次投票。

根据我的解决方案。 我正在考虑维护一个表,其中用户名是主键,另一个属性是他所做的所有支持和反对的列表。 例:

(username, array)
(baqir, up_A001 up_A050 down_Q011 up_Q123)

每当用户登录时,我都会使用此数组,并确保该用户之前所有的赞和反对票都保持原样。 如果有新的表决,请将其添加到数组中。

有更好的解决方案吗?

PS不是必需的,而是我当前的数据库结构。

class Question(models.Model):
    QID = models.CharField( default="",max_length=1000, primary_key=True)
    title = models.CharField(max_length=30, default="")
    description = models.CharField(max_length=1055, default="")
    date = models.DateTimeField(default=datetime.now, blank=True)
    username = models.CharField(max_length=6, default="")
    votes = models.IntegerField(default=0)
    approved = models.BooleanField(default=False)

    def __str__(self):
        return self.title

class Answer(models.Model):
    AID = models.CharField(max_length=1000, default="", primary_key=True)
    QID = models.ForeignKey(Question,on_delete=None)
    description = models.CharField(max_length=1055, default="")
    date = models.DateTimeField(default=datetime.now, blank=True)
    username = models.CharField(max_length=6, default="")
    votes = models.IntegerField(default=0)
    approved = models.BooleanField(default=False)

    def __str__(self):
        return self.AID

我正在使用Django。 而且,我基本上想要实现为他们对问题和答案进行投票所采用的stackoverflow。

===============>>#1 票数:3 已采纳

什么人,你在说什么? 您可以为每个Q / A或每个用户创建另一个表,或者在一个表中仅链接两件事,即user和Q / A及其可重复使用键的投票(此表没有主键)。 任何类似数组的事情都是时间和精力的损失,并且无论如何都违反了良好的数据库设计规则。

桌上投票的例子:

Table votes:
    UID | QID | AID | VOTE

因此,您可以将每个用户与他/她投票的每个问题或答案联系在一起。 QID或AID可以为NULL。 当您遇到任何问题时,您只需检查桌票是否有任何可说的内容以及与之相关的答案。 如果当前QID和UID匹配并且您得到结果,则只需采取相应措施即可。

如果您有很多用户,这可能会变慢,但实际上会很好用。

第二种解决方案是将您的问题/答案与另一个表联系在一起,仅保留做过某事(上/下投票)的用户。 这将使DB看起来更加混乱,但是当您的用户使用给定的Q及其答案时,您只需检查此表是否有关于所说访客的内容即可。 如果我不够清楚,请重复每个Q和/或A的新表。

您可以反向应用相同的技术,即将用户连接到包含用户投票的所有Q / A的表,这可能是保持顺序和效率的最佳方法。 因此,每次用户访问任何Q页面时,您都会检查他/她是否具有该Q的任何历史记录。

没有数组,没有废话。 仅需一个额外的请求即可检查当前查看的质量检查的状态。

===============>>#2 票数:1

Upvote和Downvote场景可以使用代码进行处理。如果最后一次投票是Upvote,则用户仅具有downvote的权限;如果用户downvote,则他具有Upvote的权限,但是为了保持状态,您可以将历史记录保存在数组中。

===============>>#3 票数:1

达伦建议的第一种方法似乎最好

制作一个单独的表来存储投票,在执行任何上/下投票操作之前,请检查用户之前是否已执行过任何类似操作。

如果他之前做过相反的操作,请删除/取消激活他在表中的上一个条目并进行一个新条目。 并且如果他之前已经对问题执行了相同的操作,请不要进行任何操作,因为已经考虑了他的上/下投票。

强烈建议您为此类任务创建表格,因为这不仅使您的任务更容易,而且将为您提供更大的灵活性,例如您可以为每个操作添加时间戳以跟踪历史记录,或者可以在表格以查找对一个问题执行的总操作

===============>>#4 票数:0

CREATE TABLE QuestionVotes (
    UID ...,  -- User id
    QID ...,  -- Question id
    vote ENUM('up', 'down'),
    PRIMARY KEY(QID, UID)  -- for finding voting status of a question
    INDEX(UID, QID)  -- if you need the votes by a user
) ENGINE=InnoDB;   -- to get benefit of clustered PK

同上AnswerVotes

上/下:查看该行是否存在,如果不存在,则创建该行。 如果存在行,则删除该行或抱怨用户两次向上/向下投票。

不要使用数组。 它将变得太痛苦。

如果Django不允许您使用复合主键,请放弃Django。

表中没有1000个字符的键。 磁盘空间和性能将受到影响。

用户只能输入6个字符。 不乐观地扩大规模?

  ask by Baqir Khan translate from so

未解决问题?本站智能推荐: