我很擅长使用关系数据库,但已阅读了一些书籍并了解了良好设计的基础知识.
我正面临一个设计决定,我不知道如何继续.这是我正在构建的一个非常简化的版本:人们可以对照片进行评分1-5,我需要在跟踪个人投票的同时显示图片上的平均投票.例如,12人投票1人,7人投票2人等.等等.
我的规范化怪胎最初设计了这样的表结构:
Table pictures
id* | picture | userID |
Table ratings
id* | pictureID | userID | rating
Run Code Online (Sandbox Code Playgroud)
随着所有外键约束和所有设置,因为他们应该是.每当有人对图片进行评分时,我只需在评分中添加一条新记录即可.
要查找图片的平均评分,我只需运行以下内容:
SELECT AVG(rating) FROM ratings WHERE pictureID = '5' GROUP by pictureID
Run Code Online (Sandbox Code Playgroud)
以这种方式设置它让我运行我的花哨的统计数据.我很容易找到谁将某张照片评为3,哪些不是.
现在我在想是否有一堆评级(这在我真正的设计中是非常可能的),找到平均值将变得非常昂贵和痛苦.
使用非规范化版本似乎更有效.例如:
Table picture
id | picture | userID | ratingOne | ratingTwo | ratingThree | ratingFour | ratingFive
Run Code Online (Sandbox Code Playgroud)
要计算平均值,我只需要选择一行.它似乎更有效率,但更加丑陋.
有人能指出我做正确的方向吗?我最初的研究表明,我必须"找到合适的平衡点",但我该如何找到平衡点呢?任何文章或其他阅读信息也将受到赞赏.
谢谢.
我一直试图调试这个问题好几个小时,但无济于事.我已经使用PHP很多年了,经过长时间的中断后又回到了它,所以我仍然有点生疏.
无论如何,我的$ _SESSION变量并没有因为某些我无法弄清楚的原因而保留它们的价值.该网站完全适用于localhost,但将其上传到服务器似乎打破了它.
我检查的第一件事是PHP.ini服务器设置.一切似乎都很好.事实上,我的登录系统是基于会话的,它完美地运行.所以现在我知道$ _SESSIONS正常工作并保留了我的登录价值,我假设服务器已经设置好,问题出现在我的脚本中.
这是导致问题的代码的剥离版本.通过GET变量设置后,$ type,$ order和$ style不会被保留.用户单击链接,该链接通过GET设置变量,并且该变量将在其剩余的会话中保留.
我的逻辑是否存在一些我没有看到的问题?
<?php
require_once('includes/top.php'); //first line includes a call to session_start();
require_once('includes/db.php');
$type = filter_input(INPUT_GET, 't', FILTER_VALIDATE_INT);
$order = filter_input(INPUT_GET, 'o', FILTER_VALIDATE_INT);
$style = filter_input(INPUT_GET, 's', FILTER_VALIDATE_INT);
/*
According to documentation, filter_input returns a NULL when variables
are undefined. So, if t, o, or s are not set via URL, $type, $order and $style
will be NULL.
*/
print_r($_SESSION);
/*
All other sessions, such as the login session, etc. are displayed here. …Run Code Online (Sandbox Code Playgroud)