首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库设计中的关系问题

数据库设计中的关系问题
EN

Stack Overflow用户
提问于 2008-10-02 16:49:39
回答 4查看 859关注 0票数 1

我正在为一个现有数据库进行升级,该数据库是在没有任何代码的情况下设计的,以实现正在考虑的设计。现在,我在用代码实现数据库设计方面遇到了困难。我确信这是数据库设计中的问题,还是我根本没有看到关于需要做什么的正确解决方案。

基本逻辑规定如下:

  1. 用户通过座位进入在线培训。用户可以有多个座位。
  2. 座位是由公司购买的,与产品有很多到多的关系。
  3. 产品与模块有着多到多的关系.
  4. 模块与课程有着多到多的关系。
  5. 课程是最终用户获得培训的机会。
  6. 为了混水摸鱼,出于某种原因,一些用户有多个座位,其中包含相同的产品。
  7. 认证是在每个产品的基础上进行,而不是在每个座位的基础上进行。
  8. 用户与课程之间有着多到多的关系,这些关系存储着他们当前的状态或课程的分数。
  9. 当用户完成产品的所有模块中的所有课程时,他们就会为产品认证。
  10. 了解某一特定模块的所有课程何时由用户完成也是非常重要的。
  11. 有些座位将用于ReCertification,这意味着以前为产品认证的用户可以注册并参加重新认证考试。
  12. 根据规则11,用户可以并将拥有多个认证记录。
  13. 编辑:当用户完成一个课程(分数超过80%),那么用户已经(根据当前的业务逻辑)完成了所有产品和包含该课程的所有座位的课程。

正如我或多或少地描述过的那样,我在当前的设计和业务逻辑中经常遇到的问题是,我无法找到一种有效的方法来将用户是否已经为特定的产品和座位进行认证而不是在他们没有认证的情况下联系起来。我一直在试图确定哪些产品是为用户认证的,哪些是没有认证的。部分问题是,如果它们目前在不同的座位下注册了同一产品的多个,那么我只需要计算一次产品。

下面是所涉及的模式部分的副本。任何关于如何改进设计或在代码中绘制关联的建议将不胜感激。如果这很重要,这个站点是建立在LAMPP堆栈上的。

您可以在这里查看数据库模式的相关部分:structure.png

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-10-02 17:26:28

您要寻找的是关系划分不是直接在SQL中实现的,但它是可以实现的。搜索谷歌的其他例子。

票数 2
EN

Stack Overflow用户

发布于 2008-10-02 17:40:06

在快速查看了模式之后,我认为您可以做的一件事就是创建一个'to_be_certified‘表。当一个产品被分配到一个位置时(当user_id被填充时),使用product_id和seat_id填充它。

在向certification_rtab表添加记录时,删除“to_be_certified”表中的相应记录。这将使您可以轻松地访问所有的产品,这些产品是为用户认证的,而不是的。

为了摆脱重复的product_ids,您可以按照product_id进行分组。

票数 0
EN

Stack Overflow用户

发布于 2008-10-02 18:29:21

您需要对lessonstatus_rtab表进行更改:

代码语言:javascript
运行
复制
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%或更高,与产品所有模块中的课程数量相同。

代码语言:javascript
运行
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/163400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档