Database design web2py中的多对多关系

Database design web2py中的多对多关系,database-design,many-to-many,relational-database,relationship,web2py,Database Design,Many To Many,Relational Database,Relationship,Web2py,我的web2py项目中有一个类似于此的文章表: db.define_table('articles', Field('created_on', 'datetime', default = datetime.today(), required = True, notnull = True, requires = [IS_NOT_EMPTY(),

我的web2py项目中有一个类似于此的文章表:

db.define_table('articles',
                Field('created_on', 'datetime', default = datetime.today(),
                      required = True, notnull = True,
                      requires = [IS_NOT_EMPTY(),
                                  IS_DATETIME(format=T('%Y-%m-%d %H:%M:%S'))]),
                Field('article_en', 'text', required = True,
                      notnull = True, requires = IS_NOT_EMPTY()))
还有一个是跟踪上传文件的:

db.define_table('files',
                Field('filename', 'string', required = True, notnull = True),
                Field('uploaded_data', 'upload', autodelete = True,
                      required = True, notnull = True, requires = IS_NOT_EMPTY()),
                Field('created_on', 'datetime', required = True, notnull = True))
现在我希望文章使用的每个文件都有引用,文件所属的每个文章都有引用。我需要这个,这样我就可以轻松地删除未使用的文件,而不会因为忽略关系而弄乱文章

更直截了当地说,这种关系非常接近: 每篇文章都有几个文件,每个文件链接到不同的文章

从我从web2py书中收集到的信息来看,对多对多关系没有直接的支持。为了解决这个问题,一个简单的解决方法是使用一个处理关系的中间表,但显然我不是一个数据库专家,所以我几乎不知道应该如何做

我们将非常感谢您的帮助

web2py确实支持。您可以通过定义一个链接其他两个表的中间表来完成此操作:

db.define_table('article_files',
    Field('article', db.articles),
    Field('file', db.files))
这不是一种解决方法,而是在RDBMS中处理此类关系的标准方法。注意,web2py使用数据库抽象层(DAL),而不是ORM。ORM通常不需要显式定义中间表,尽管它仍然会在幕后创建一个中间表


您还可以考虑使用字段。

非常感谢。这正是我需要的。不过,还有一个问题,使用list:reference而不是标准方法有什么好处吗?根据您所做的工作,list:reference可以使某些功能更易于编程,但也有一些局限性(例如,如果你从文件表中删除一条给定的记录,你必须检查你所有的文章记录,并从任何文章列表中删除该记录ID:引用字段)。在这种情况下,我将坚持标准方法。在我的用例中,这应该更有效。感谢你花时间。是的,我认为这可能是我的方法。