我该如何管理我的多对多关系?

时间:2010-04-04 19:02:29

标签: codeigniter foreign-keys relational-database

我有一个包含几个表的数据库:文件和用户。这种关系是多对多的,所以我还有一个名为users_files_ref的表,它保存了上述两个表的外键。

这是每个表的架构:

个文件 - > file_id,file_name

用户 - > user_id,user_name

users_files_ref - > user_file_ref_id,user_id,file_id

我正在使用Codeigniter构建文件宿主应用程序,而我正在添加允许用户上传文件的功能。这是我遇到问题的地方。

一旦我将文件添加到files表中,我将需要该新文件的id来更新users_files_ref表。现在我正在将记录添加到files表中,然后我想我会运行一个查询来获取最后添加的文件,以便我可以获取ID,然后使用该ID插入新的users_files_ref记录。

我知道这可以小规模运行,但我想有一种更好的方法来管理这些记录,尤其是在交通繁忙的情况下。

我是关系数据库的新手,但已经使用PHP一段时间了,所以请在这里忍受: - )

我为文件,用户和users_files_ref表正确设置了主键和外键,我只是想知道如何管理此场景的文件记录添加?

感谢您提供的任何帮助,非常感谢。

-Wes

3 个答案:

答案 0 :(得分:1)

使用$this->db->insert_id()获取刚刚插入的行的ID号。这里有进一步的文档:http://codeigniter.com/user_guide/database/helpers.html

答案 1 :(得分:0)

我认为你需要的就是这个:

                   ----primary key-----
users_files_ref -> | user_id, file_id |

如何获取file_id取决于您正在实施的代码。你的推理是正确的。您已经拥有user_id,只需要获取file_id。使用这些值,您可以向user_files_ref添加新行。

当我需要这样做时,我通常在一个插入文件的序列的帮助下有一个存储过程,并返回序列NEXTVAL作为输出。这可能是实施此类中心的一种方式。

这是基于Oracle的存储过程的代码:

CREATE OR REPLACE PROCEDURE SP_IMPORT_FILE(FILE    IN  FILE.FILE%TYPE,
                                           FILE_ID OUT NUMBER)

IS

BEGIN

  SELECT SEQ_FILE.NEXTVAL INTO FILE_ID from DUAL;

  INSERT INTO FILE (FILE_ID, FILE) VALUES (FILE_ID, FILE);

END SP_IMPORT_FILE;

答案 2 :(得分:0)

您基本上是通过一项重要调整来描述它是如何完成的:如何检索文件的file_id以便能够将其添加到users_files_ref。

通常在数据库环境中,您有许多客户端同时连接,同时进行更新。在这样的环境中,您不能只获取添加的最后一个文件的file_id - 它可能是在您的数据库调用之间添加的某个elses文件。您必须使用数据库的功能来获取生成的ID(例如,MSSQL上的SELECT @@IDENTITY)或以某种方式在应用程序代码中生成ID。