我正在进行的项目使用了用户创建的多个"墙"进行讨论。
我的问题是如何在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称为外键。
你可能想买一本关于数据库设计的像样的书,或者读几篇文章——这对你有很大帮助。我使用了《数据库的漫画指南》,它有点老套,但它确实帮助我了解如何构建关系数据库。我相信很多其他人也会推荐关于这个主题的好书或文章。
让我们逐一分解场景:
- 首先,您应该有一个user_id作为主键的用户表
- 那你应该有一张靠墙的桌子。主键将是wall_id,外键[/strong>将为用户表中的user_id,因为每个墙只属于一个用户。user_id也将是该表中的唯一键
- 那么就需要一个消息表。它将存储消息以及message_id的主键字段
- 最后,您将需要一个message_wall表来存储哪个消息属于哪个表的信息。这里message_id、wall_id将是外键和复合主键
希望能有所帮助。