在我正在开发的应用程序的最初“版本”中,没有考虑到设计因素 - 没有人想到这一点。
不过看来原来的一对多关系需要重构为多对多。我的问题是如何最好地做到这一点?我使用 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/