哪个会更好地记录投票和订阅问题?
A。 2个表,每个订阅 1个投票,每个表都有外键加入问题 ,在这种情况下,我会查询每个表的2个查询的并集,以获取该问题的所有活动。
或
B。 1个表,其中1个外键可以加入问题,还有一个字段可以记录该行是投票还是订阅即可。在这种情况下,我的其他一些查询也会有额外的连接条件。
答案 0 :(得分:3)
当你谈到'缩放'时,你必须更精确地想要扩展的操作?*你需要优化读,写吗?文件转储?获取外部内容?
一旦您知道要扩展的 ,通常您还需要或想要找出要扩展到的多少,以及 if通过基准测试和分析,您的调整可以提供所有的任何好处。
这很有趣,具体取决于具体情况。星期六晚上的基准测试并不合适。
我所知道的一些数据库优化技术涉及非规范化以及在普通环境中看不到的那些技巧,因此使用这些“黑客”以获得更好的性能有时(通常)会为代码可维护性带来代价。在上面提到的非规范化技术的情况下,您丢失了数据库提供的一些数据完整性,然后必须在您的应用程序代码中实现它。
开发人员不太好,他必须复制数据库的数据完整性才能获得更快的数据库查询时间。鉴于上述情况,朋友,这是我的拙见(作为一个懒惰的开发人员),通过忽视首先出现的扩展问题,可以避免许多扩展问题,直到它们发生。
如果你想谈谈标准的,良好的数据库构建实践,从一般的sql角度来看,我只知道2种主要方式,规范化方式和非规范化方式。两者都有子变种,但我想这看起来像你的A和你的B.两者都是有效的选择,两者都有利有弊,但如果你的应用程序不会被一分钟的数千次点击淹没,我会说使用A,也许类似于此:
Table votes
- 拥有主键vid,
Table questions
- 有主键
Table subscriptions
- 有主sid,外键vid,qid
答案 1 :(得分:1)
一般来说,JOIN
比单个表上的WHERE
子句更昂贵,所以如果您唯一的考虑是扩展一个大型数据集,我会使用选项B.说,比简单缩放更重要的是正确的数据设计,除非你能保证投票和订阅基本保持不变(这是罕见的),你最好用A。例如,如果在某些时候你想要为投票添加一个点值(不只是是/否),那么两个表就更合适了。