Baq*_*han 2 mysql database django database-design
我有一个网站,里面有一个论坛。所有问题都有唯一的 ID,答案也有唯一的 ID,并带有引用问题 ID 的外键。
我有一个用户登录。使用ajax,我可以发送数据(赞成/反对,QID/AID,用户名)。但是很少有问题。
每当用户重新登录时,我希望当他打开问题时,应该显示他之前的赞成票和反对票。
用户不能对同一问题多次投赞成票/反对票。就像如果他对一个问题投了 +1 票,他只能投反对票,而不能再次投赞成票。
按照我的解决办法。我正在考虑维护一个表,其中用户名是主键,另一个属性是他所做的所有赞成票和反对票的列表。例子:
(username, array)
(baqir, up_A001 up_A050 down_Q011 up_Q123)
Run Code Online (Sandbox Code Playgroud)
每当用户登录时,我都会获取该数组并确保用户之前的所有赞成票和反对票均保持原样。如果有新的投票,我会将其添加到数组中。
还有更好的解决办法吗?
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
Run Code Online (Sandbox Code Playgroud)
我正在使用 Django。我基本上想要 stackoverflow 为他们的问题和答案投票而实现的任何东西。
什么阵列的人,你在说什么?您为每个 Q/A 或每个用户创建另一个表,或者一个仅链接两个事物的表,即用户和 Q/A 及其键可以重复的投票(该表没有主键)。任何类似数组的东西都会浪费时间和精力,而且无论如何它都违反良好的数据库设计规则。
保留投票表的示例:
Table votes:
UID | QID | AID | VOTE
Run Code Online (Sandbox Code Playgroud)
因此,您可以将每个用户与他/她投票的每个问题或答案联系起来。QID 或 AID 可以为 NULL。当您遇到某个问题时,您只需检查表投票是否有相关内容以及与之相关的答案即可。如果当前 QID 和 UID 匹配并且您得到结果,您只需采取相应的操作即可。
如果您有很多用户,这可能会很慢,但本质上会很好用。
第二个解决方案是将您的问题/答案与另一个表联系起来,只保留做了某事的用户(向上/向下投票)。这将使数据库看起来更混乱,但是当您的用户来到给定的问题及其答案时,您只需检查该表是否有关于所述访问者的内容。如果我不够清楚,我会重复每个问题和/或 A 的新表格。
您可以反向应用相同的技术,即将用户连接到一个包含用户投票的所有 Q/A 的表,这可能是保持秩序和效率的最佳方式。因此,每次用户访问任何 Q 页面时,您都会检查他/她是否有该 Q 的任何历史记录。
没有数组,没有废话。只需一项额外请求即可检查当前查看的问答的状态。