MySQL将表实现到数据库中

时间:2012-08-13 23:35:51

标签: mysql sql database create-table

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

  • 用户发布的消息以及任何人和所有人都可以阅读的消息
  • 用户发布且非公开的消息。这些消息只能由发布用户标记为朋友的用户读取。

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

  • 区分三种消息的方法。这涉及对Message表的更改。
  • 指定特定邮件的收件人的方式。这可能需要额外的表格。

所有这些必须以最少的存储量再次实现,即您必须从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'。

我对这个问题的处理方法是否正确?还有另一种方法可以让它更有效率吗?

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

1 个答案:

答案 0 :(得分: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)