我正在进行的项目使用多个“墙”进行用户创建的讨论。
我的问题与如何在 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
表格。user_id
wall
wall_id
让我们一一分解场景:
希望有帮助。
只需创建一个名为“Wall”的表并将 wall_id 作为您的主键
create table wall(wall_id int ,primary key(wall_id));
然后创建带有外键的“消息”表到 wall_id 为
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称为外键。
你可能想考虑买一本关于数据库设计的好书或阅读几篇文章——它对你的帮助无穷无尽。我使用了“数据库漫画指南”,它有点老套,但它确实帮助我了解了如何构建关系数据库。我相信许多其他人也将能够推荐关于这个主题的好书或文章。