mysql - 在 MySQL 中将一对多关系重构为多对多 : How to formulate the query?

标签 mysql database database-design refactoring

在我正在开发的应用程序的最初“版本”中,没有考虑到设计因素 - 没有人想到这一点。

不过看来原来的一对多关系需要重构为多对多。我的问题是如何最好地做到这一点?我使用 MySQL 来实现持久性。

填充关系表只是一次性的工作,我宁愿使用简单的查询或存储过程方法(我不太熟悉后者);而不是编写基于 java/jdbc 的逻辑来做到这一点(我知道我可以,而且也不是太难,但这不是我想要的)

这是一个关系示例:

|VirtualWhiteBoard| -1------*- |Post|

虚拟白板可以有很多帖子。新功能是:如果用户选择“复制”当前白板(之前没有想到),则 1 个帖子应属于多个白板

架构如下所示:

VirtualWhiteBoard (wallName, projectName,dateOfCreation,..., Primary_Key(wallName, projectName));
Post(post_id, wallName,postData,..., Primary_Key(post_id), Foreign_Key(wallName, projectName));

虚拟白板有一个复合主键(wallName,projectName),每个帖子都有一个post_id作为主键

问题:从 VirtualWhiteBoard 和 Post 中获取主键并将其添加到新关系“has_posts”中:

|VirtualWhiteBoard| -1------*- |has_Post| -*------1- |Post|

保持之前的关系不变,然后删除Post中wallName的外键列。

如何最好地实现这一目标?查询就足够了还是需要存储过程?

(虽然我可以在“应用程序”中执行此操作,但我更愿意这样做,因为这样的重构必然会出现,并且我不希望存在需要维护的不必要的 java 代码并且个人也希望拥有这样的技能:)

最佳答案

创建包含 post_id 和 wallName 两列的 has_Post 表,并使用以下查询填充它:

INSERT INTO has_Post(post_id, wallName) SELECT post_id, wallName FROM Post

然后从 Post 表中删除 wallName 列。

关于mysql - 在 MySQL 中将一对多关系重构为多对多 : How to formulate the query?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7780743/

相关文章:

mysql - 如何使用 xslt 将默认的 mysql modtimes 转换为 UTC 日期时间

android - 从 SQLite 中检索单个数据并在 TextView 中显示(Android 开发)

android - Realm 是否支持Android 上的模糊查询

mysql - 两个表之间的数据库消息系统

PHP:将动态数量的值添加到 MySQL 数据库中

mysql - 仅从另一个表中获取 1 个条目

sql - 选择同一列上的两个计数

database - Postgres。查询有时会很长。

php - 在表中经常将一列空为 NULL 是不是很糟糕?

php - 从数据库中获取今天的出生日期