2011-05-11 64 views
0

我使用数据库为网站创建树视图。我将创建2个表格,我们称之为“文件夹”和“文件”。一个文件夹可以包含多个文件夹和文件,并且文件将充当叶节点 - 这意味着如果您不熟悉该术语,它们就是树中的“死胡同”。将列值限制为同一个表内不同列的值?

的文件表将包含列:

Folder_id, Folder_name, Folder_parent 

文件将包含:

File_id, File_name, File_parent 

显然File_parent将引用folder_id,从而创造一个外键,但如何让Folder_parent参考Folder_id?

例子:

FOLDER_NAME | FOLDER_ID | FOLDER_PARENT 
root    1    null 
Cars    2     1 
Planes    3     1 
BMW    4     2 
+0

我认为你错过了这一点,file_parent已经指向folder_id,所以当你看一个文件夹时,你选择file_id其中folder_name ='example' – 2011-05-11 11:17:15

+0

@Abe当创建一个文件很容易确保它不有一个不存在的父级,因为file_parent引用了folder_id。但是在创建文件夹时,不存在类似的故障安全。我可以在插入之前检查id是否有效(从folder_id = parameter选择* from文件夹,如果找到任何文件),但是没有更多的.. table side解决方案吗? – 2011-05-11 12:17:48

回答

0
create table folder (
    folder_id int primary key, 
    folder_name varchar not null, 
    folder_parent int references folder(folder_id) 
) 
0

我会做一个独立的表来处理的关系,因为一个文件可以在两个文件夹(别名觉得)很容易地存在。在这个模式中,你可以简化事情只是一个node表和relationships(或edges,如果你熟悉图论)表:

CREATE TABLE nodes (
    node_id int primary key, 
    node_name varchar not null, 
    node_type enum('folder','file') 
) 

CREATE TABLE edges (
    child_node_id int primary key, 
    parent_node_id int, 
    unique(child_node_id, parent_node_id) 
) 

我对我的SQL有点生疏,所以我语法可能需要一些工作,但这就是我如何处理它。这种方式更加灵活。

相关问题