[英]Database Design Issues with relationships
我正在对现有数据库进行升级,该数据库的设计没有任何代码来实现正在考虑的设计。 现在,我在用代码实现数据库设计方面遇到了困难。 我确定是数据库设计有问题,还是我只是没有看到关于如何完成需要做的事情的正确解决方案。
基本逻辑规定如下:
正如我或多或少描述的那样,我一直遇到当前设计和业务逻辑的麻烦是,我无法找到一种方法来有效地将用户是否已获得特定产品和座位的认证与他们何时获得认证联系起来没有。 我一直在尝试确定哪些产品的座椅已经为用户认证,哪些没有。 部分问题是因为如果他们当前在不同席位下注册了多个相同产品,那么我只需要计算一次产品。
下面是所涉及的架构部分的副本。 任何关于如何改进设计或在代码中绘制关联的建议将不胜感激。 如果重要的话,这个站点是建立在 LAMPP 堆栈上的。
您可以在此处查看数据库架构的相关部分: http://lpsoftware.com/problem_db_structure.png
你要找的是关系除法没有直接在SQL中实现,但可以做到。 在谷歌搜索其他示例。
快速查看架构后,我认为您可以做的一件事是创建一个“to_be_certified”表。 当产品被分配给一个座位时(当 product_seat_rtab 被填充时),用 user_id、product_id 和seat_id 填充它。
在certification_rtab 表中添加记录时,删除'to_be_certified' 表中的相应记录。 这将使您可以轻松访问所有已为用户认证的产品和未认证的产品。
要去除重复的 product_id,您可以按 product_id 分组。
您需要对课程状态_rtab 表进行更改:
CREATE TABLE lessonstatus_rtab (
user_id INT NOT NULL,
seat_id INT NOT NULL,
lesson_id INT NOT NULL REFERENCES lesson_rtab,
accessdate TIMESTAMP,
score NUMERIC(5,2) NOT NULL DEFAULT 0,
PRIMARY KEY (user_id, seat_id, lesson_id),
FOREIGN KEY (user_id, seat_id) REFERENCES user_seat_rtab (user_id, seat_id)
);
然后你可以查询用户有席位的每个产品,他是否认证? 这假设他获得的课程数量(例如 50% 或更高)与产品所有模块中的课程数量相同。
SELECT p.name, us.user_id, us.seat_id, COUNT(l.id) = COUNT(lu.lesson_id) AS is_certified
FROM user_seat_rtab AS us
JOIN seat_rtab AS s ON (s.id = us.seat_id)
JOIN product_seat_rtab AS ps ON (ps.seat_id = s.id)
JOIN product_rtab AS p ON (p.id = ps.product_id)
JOIN product_module_rtab AS pm ON (pm.product_id = p.id)
JOIN module_rtab AS m ON (m.id = pm.module_id)
JOIN module_lesson_rtab AS ml ON (ml.module_id = m.id)
JOIN lesson_rtab AS l ON (l.id = ml.lesson_id)
LEFT OUTER JOIN lessonstatus_rtab AS lu
ON (lu.lesson_id = l.id AND lu.user_id = us.user_id
AND lu.seat_id = us.seat_id AND lu.score > 0.50)
GROUP BY p.id, us.user_id, us.seat_id;
更新:
我已经进一步考虑了这个问题,并考虑过简单地删除 user_seat_rtab 表,然后使用等效的certification_rtab 表(可能已重命名)来保存有关用户席位状态的所有信息是否能让事情更好地工作。 通过这种方式,在用户、他们的席位、席位内的每个产品以及用户是否已针对特定产品和席位进行认证之间建立了直接关系。
因此,我会将以下更改应用于随问题发布的架构:
DROP TABLE user_seat_rtab;
RENAME TABLE certification_rtab TO something_different;
进一步规范这个新结构的另一种方法是做这样的事情:
ALTER TABLE user_seat_rtab
DROP PRIMARY KEY;
ADD COLUMN product_id int(10) unsigned NOT NULL;
ADD CONSTRAINT pk_user_seat_product PRIMARY KEY (user_id, seat_id, product_id);
ADD CONSTRAINT fk_product_user_seat FOREIGN KEY (product_id) REFERENCES product_rtab(id) ON DELETE RESTRICT;
我不确定这是否会解决问题,或者它是否会在引入新问题的同时稍微改变问题的性质。 那么,有没有人有任何其他批评或建议?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.