【问题标题】:Database Designing One-to-One Relationship数据库设计一对一关系
【发布时间】:2015-08-05 10:44:02
【问题描述】:

我是数据库设计的初学者。我有点困惑 一对一的关系。

我有一个名为 task_tbl 的表,我希望用户对任务进行评分(评分将是 5 星、1 到 5 星)。我对如何做有点紧张;我应该创建另一个名为 rate_tbl 的表,还是应该将它放在 task_tbl 的名为 rate 的列中?该任务在数据库中只能有 1 个评分,从 1 到 5。

这是我的task_tbl

CREATE TABLE `task` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(200) NOT NULL,
    `description` VARCHAR(1000) NOT NULL,
    `start_date` DATETIME NOT NULL,
    `end_date` DATETIME NOT NULL,       
    `created_by` INT(11) NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=13;

【问题讨论】:

  • 很少需要 1:1。

标签: php mysql database oracle database-design


【解决方案1】:

您正在关联任务及其评分(我想您的意思是评分,而不是酒店的食物价格)。

因此,根据规范化,您应该创建另一个表 rating_table,该表将具有从 010 的预定义值,因为评级将在 0 到 10 之间。

现在您需要另一个表 tasks_ratings,其中包含 task_idrating_iduser_id

看,从 rating_table 获取从 0 到 10 的评分将在 Web 浏览器中显示给用户,他们的 Response(他们给出的评分)将存储在 tasks_ratings 表中,其中包含 user_id 、 task_id 和 rating_id .

现在,如果您想通过从任务表中获取任务 ID 来计算平均评分,请使用 tasks_ratings 表中的 avg()

【讨论】:

  • 先生,我不是在谈论 $ 费率,我说的是五开始评级,当用户点击第二颗星时,它应该在数据库中存储 2,如果他点击 5 号星,那么它应该存储6 在数据库中。
  • @usama ,那么您应该已经将其清除了。无论如何检查更新的答案。
  • 先生,您在这里创建第三张表,那么这意味着它将成为多对多关系是不是先生...如果是这样,那么我们为什么要这样做为什么我们要创建第三张表可以'不是我们在评级表中添加用户ID和任务ID。这样它就会成为一对一的关系。
  • 是的,它是一对一的关系,因为我们看到一个任务只能有 1 个评级(比如它的 7)。但是请注意,您将始终希望用户显示他给出的评价。看看我明天是否在同一个任务页面上回来,我将能够看到我给出的评分。第二个原因是:您将(当然)必须计算 10000 个用户给出的任务的平均评分。因此,要获得 AVG() ,平均 ,您需要该任务的所有评级。希望这是有道理的。
  • @usama ,很高兴为您提供帮助 :) 。而且我不是先生,我才 23 岁 :)。
【解决方案2】:

如果 1-1 表示任何任务可能只有一个评级,则不需要其他表格:

CREATE TABLE `task` (
    ...
    `rating`      int default 1,
    constraint CK_Task_Rating check( rating between 1 and 5 )
)

如果您希望每个用户能够对任何任务进行评分,那么您需要另一个表:

create table User_Task_Ratings(
    UserID  int not null references Users( ID ),
    TaskID  int not null references Tasks( ID ),
    Rating  int check( Rating between 1 and 5 ),
    constraint PK_User_Task_Ratings primary key( UserID, TaskID )
);

因此,每个用户都可以对任何任务给出一个评分。从技术上讲,这是用户和任务之间的多对多交集表。但是从评分的角度来看,这个用户可能会给那个任务一个且只有一个评分。

如果您使用第二种选择,您仍然可以在“任务”表中有一个评分字段,其中可能包含该任务的所有用户评分的平均值。但是,我会创建一个视图来显示任务数据并计算平均值,可能还有另一个字段,其中包含对任务进行评分的用户数量。这简化了维护,因为您不需要保持视图同步。

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多