讨论MySQL数据库结构


Discussion MySQL Database Structure

我正在进行的项目使用了用户创建的多个"墙"进行讨论。

我的问题是如何在MySQL数据库中对此进行建模。

一个名为"walls"的表包含信息(如谁创建了它等),另一个表名为"messages",包含每个带有"wall_id"列的消息,以区分它属于哪里,这会奏效吗?

此外,"messages"表是否应该使用wall_id作为索引的主键?或者重复编号对主键没有用处?

我对"正确的方式"建模数据库相对陌生,任何建议或可靠的帮助都将大大提高数据处理的效率和方便性。

除了您所说的主键之外,您的方法确实是正确的。主键必须是唯一的。可以将多个字段作为主键,但主键本身必须是唯一的。

所以你会有下面的表格。

CREATE TABLE `wall` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT(10) UNSIGNED NOT NULL,
  `name` VARCHAR(50) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `user` (`user_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
CREATE TABLE `user` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
CREATE TABLE `message` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `wall_id` INT(10) UNSIGNED NOT NULL,
  `user_id` INT(10) UNSIGNED NOT NULL,
  `message` TEXT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `wall` (`wall_id`),
  INDEX `user` (`user_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

然后,您将关联user_id上的user表和wall_id上的wall表。

只需创建一个名为"Wall"的表,并将Wall_id作为主键

create table wall(wall_id int ,primary key(wall_id));

然后用wall_id的foriegn密钥创建"消息"表作为

create table message(mes_belong_id int,primary key(mes_belong_id),wall_id int,foreign   key(wall_id) references wall(wall_id));

然后将每条消息保存在您需要的同一个墙id下,并自动存储到消息中。如果您想检索消息,只需使用wall_id即可。

基本规范化表

Users
User_id  Name  otherFields
Category
Category_id  Cat_name
Walls
Wall_id  User_id Cat_name
Messages
Message_id User_id Wall_id Message

基本的东西会吗

场景1因此,为了显示基于user_id的所有特定用户的所有墙,并加入消息

场景2根据category_id 将所有墙显示为特定类别

你可以根据你需要的其他东西来扩展它。

如您所述,我将使用两个表,一个用于墙,另一个用于消息,墙的主键是一个自动递增的整数。对于消息,再次使用一个自动递增的整数作为主键,但它也应该将墙ID作为外键。

我最近构建了一个WordPress公告板插件,它的工作原理类似于此,每个公告板都嵌入在一个页面中。这些页面已经由WordPress设置,所以这只是添加一个公告板表的情况,每个页面都有自己的主键,但也将WordPress页面ID称为外键。

你可能想买一本关于数据库设计的像样的书,或者读几篇文章——这对你有很大帮助。我使用了《数据库的漫画指南》,它有点老套,但它确实帮助我了解如何构建关系数据库。我相信很多其他人也会推荐关于这个主题的好书或文章。

让我们逐一分解场景:

  1. 首先,您应该有一个user_id作为主键的用户表
  2. 那你应该有一张靠墙的桌子。主键将是wall_id,外键[/strong>将为用户表中的user_id,因为每个墙只属于一个用户。user_id也将是该表中的唯一键
  3. 那么就需要一个消息表。它将存储消息以及message_id的主键字段
  4. 最后,您将需要一个message_wall表来存储哪个消息属于哪个表的信息。这里message_id、wall_id将是外键复合主键

希望能有所帮助。