0

我必须实现以下任务: 任务:目前,数据库知道两种类型的消息:

  • 用户发布且公开供所有人阅读的消息
  • 用户发布的非公开消息。这些消息只能被发帖用户标记为朋友的用户阅读。

在此步骤中,您应该添加第三种类型的消息。这第三种类型的消息应该只能由指定的收件人阅读。这意味着数据库需要提供以下内容:

  • 一种区分三种类型消息的方法。这涉及对消息表的更改。
  • 一种指定特定消息的收件人是谁的方法。这可能需要一个额外的表。

所有这一切都必须再次以最少的存储量来实现,即,您必须从 MySQL 手册中选择适当的数据类型。您可以假设随着时间的推移添加的消息总数可能达到 1,000,000,000 条。您的工作是为此目的实施必要的更改和附加表以及所需的任何键和外键关系。

这是我的两张表:用户

CREATE TABLE IF NOT EXISTS `User` (
`user_id` int(10) unsigned NOT NULL auto_increment,
`given_name` varchar(60) default NULL,
`surname` varchar(60) default NULL,
`address` varchar(255) default NULL,
`city_id` int(10) unsigned NOT NULL,
`date_of_birth` datetime default NULL,
`email` varchar(80) default NULL,
PRIMARY KEY (`user_id`),
KEY `ix_user_surname` (`surname`),
KEY `ix_user_given_name` (`given_name`),
KEY `ix_user_name` (`given_name`,`surname`),
KEY `ix_user_date_of_birth` (`date_of_birth`),
KEY `ix_user_email` (`email`),
KEY `ix_user_city_id` (`city_id`)
) ENGINE=InnoDB

第二张表:留言

CREATE TABLE IF NOT EXISTS `Message` (
`message_id` int(10) unsigned NOT NULL auto_increment,
`owner_id` int(10) unsigned default NULL,
`subject` varchar(255) default NULL,
`body` text,
`posted` datetime default NULL,
`is_public` tinyint(4) default '0',
PRIMARY KEY (`message_id`),
KEY `ix_message_owner_id` (`owner_id`)
) ENGINE=InnoDB

我的解决方案:我正在考虑创建一个名为“Message_level”的新表,并有列“message_level_id”(将 1、2、3 称为 1=public、2=private、3=specific)和“message_level”(其中将在级别旁边声明公共,私人和特定)。然后我可以将“Message_level”用作“Message”表的外键,并将“is_public”列替换为“message_level_id”。

我对这个问题的处理方法正确吗?还有另一种方法可以提高效率吗?

我将如何处理指定特定消息的收件人是谁的第二个任务?

4

1 回答 1

1

我会这样:

User: user_id, given_name, ...

Message: message_id, owner_id (fk User), subject, body, posted, message_type_id (fk Message_type)...

Message_recipients: user_id (fk User), message_id (fk Message)

Message_type: message_type_id, description (1:public, 2:friends, 3:specific_recipients)
于 2012-08-13T23:58:45.847 回答