将列值限制为同一个表内不同列的值?
问题描述:
我使用数据库为网站创建树视图。我将创建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
答
create table folder (
folder_id int primary key,
folder_name varchar not null,
folder_parent int references folder(folder_id)
)
答
我会做一个独立的表来处理的关系,因为一个文件可以在两个文件夹(别名觉得)很容易地存在。在这个模式中,你可以简化事情只是一个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有点生疏,所以我语法可能需要一些工作,但这就是我如何处理它。这种方式更加灵活。
我认为你错过了这一点,file_parent已经指向folder_id,所以当你看一个文件夹时,你选择file_id其中folder_name ='example' – 2011-05-11 11:17:15
@Abe当创建一个文件很容易确保它不有一个不存在的父级,因为file_parent引用了folder_id。但是在创建文件夹时,不存在类似的故障安全。我可以在插入之前检查id是否有效(从folder_id = parameter选择* from文件夹,如果找到任何文件),但是没有更多的.. table side解决方案吗? – 2011-05-11 12:17:48