2016-02-29 88 views
0

我在我的数据库中创建了3个表:文件,文件内容和用户。在DB中建立关系和外键

filecontents'结构是这样的:

id___fileid___filesize___userid___version___path

files'是:

fileid___filesize___userid___filename___mimetype 

而且users'

userid___username___password___email 

那么我们应该如何关系和外键约束看起来像这样用户就可以拥有多文件,每个文件可以有多个版本所以fileid不应该是uniqe(我猜)。这就像 - 用户1有文件ID 1,2,3。用户2有不同的文件,但他们的文件ID应该从1重新开始。

+0

Files.fileID,users.userID和filecontents.id对我来说都很像PK,而filecontents.fileID,Files.userId和filecontents.userID对我来说就像是外键。为什么files.fileID不是唯一的?为什么他们的fileID需要再次从1开始?这不是PK的本质。 – xQbert

+0

因为我的应用程序的逻辑是每个用户的文件的ID是从1开始 – Alex

+0

这听起来更像是一个显示问题,而不是DB设计之一。如果您需要订单,请添加一个“files.FileOrder”列,并从那里开始并递增。否则你会超载一个PK领域,如果他们以后想“重新排序”那些文件,可能会导致你头痛。 – xQbert

回答

0

据我所知,在表格中只能有一个自动增量列。所以要做你想做的事情,这不应该是一个制约因素。

您将要使用像SELECT fileid ORDER BY fileid DESC where userid = x

东西然后使用的fileid + 1插入新行查询最大的fileid。所以,你会做这样的事情:

INSERT INTO xxx SET fileid=(SELECT fileid FROM files ORDER BY fileid DESC where userid=x), userid=x 

随着中说,如果FILEID是主键,而不是一个组合键,它应该是一个自动递增。所以你不应该为每个用户设置一组不同的fileid。

0

userfile之间的关系表是one to manyuser and file_contents表的关系同样如此。 filefile_contents表之间的关系将为one to one

Files.user_id将是来自表usersforeign密钥,其中它是primary密钥。 File_contents.user_id也是foreign的关键。 Files.fileID, users.userID and file_contents.id在他们各自的表格中都是primary键。