为什么要这样做呢?我认为写唯一的表名比写Vote再加上额外的where语句
(type & upOrDownTypeBit) <>0
更容易些。注意:(Up|Down)Vote表是
PK id, FK userId
。(type & upOrDownTypeBit) <>0
更容易些。PK id, FK userId
。在数据建模方面,了解事物的含义通常很重要。
一个人对同一件事情进行赞成和反对投票是否等同于该人对某件事情不投票?
无论如何,通过适当的索引以提高性能,将其放在单个表中以便管理是完全可行的。在基本表之上,您可以添加UpVote和DownVote视图。或者您也可以采用另一种方法,即使用两个基本表,并为方便起见使用单个Votes视图。
通常,现在有两个表意味着有两组引用完整性、必须维护的半相同表模式以及数据的不太统一的视图。这也意味着您可能需要两个存档和/或分区计划来处理历史记录等。
这并不意味着它是错误的,但如果实体非常相似,则将它们建模为单个表通常是有意义的。
有时实体可能看起来相似,但实际上它们确实不同,应该将它们建模为单独的表。报价、采购订单和发票就是这样的例子。许多人喜欢将其中两个或更多的内容塞入同一个表中,这真的是一个坏主意。
为什么不直接使用INT?我非常怀疑BIT数据由于填充等原因所占的空间与INT相同。使用INT,你可以有:
-1: downvote
0: neutral vote (might not be used)
1: upvote
NULL: no vote
你的投票表可能如下所示:
create table votes (
post INT,
user INT,
vote INT
);
投票表应该有对帖子和用户的外键约束,以及(post, user)上的索引,但我不知道MySQL中的语法是什么。
将这些内容合并到单个表格中的一个有用之处是可以通过为表格中的上投票分配+1和为下投票分配-1来快速找到总体净投票。
然后您可以执行:
SELECT SUM(delta) FROM votes WHERE id = ?
一个人可以同时有点赞和踩吗?如果不行,那么两个表格就没有意义了。此外,你需要编写两个查询语句来删除投票;每个表格都需要一条。这样做还值得吗?
当读取数据时,您的方法将提供一定的易用性。单个表在写入数据时提供易用性。使用两个表时,您必须在决定要写入哪个表之前检查值。对于单个表,您甚至不知道或关心变量的内容就可以写入表中。我认为这是一种更正常的做事方式,尤其是当超出此单个示例时。
为了允许上下投票,您可以为每个选项添加一个布尔列。
在应用上下文中做出最有意义的事情。记住哪些系统将使用数据,并确保您实现的内容对这些系统是有意义的。还要考虑更改表格的成本,如果有一天您发现需要更改,这种成本往往会增加(如果有多个应用程序使用该数据,则会更高)。
但归根结底,这是您的数据,请以最简单的方式表示。