2010-10-22 150 views
1

我有表文件夹,其中列parent_id引用id如果该文件夹有父,如果不是,则parent_id为null。这是好的解决方案,或者我需要额外的表格用于此连接或其他解决方案?外键可以为空,如果可以的话,这个解决方案会有更大的时间执行吗?外键null - 性能下降

table folder(
    id int primary key,   //primary key in my table 
    parent_id int references id, //foreign key on id column in same table 
.... 
) 

回答

2

您可以拥有NULL外键。没问题。我不会为没有父文件夹(根文件夹)的文件夹添加额外的表。它会让你的设计更加复杂,没有任何好处。

+0

我认为额外的表像表分机(id_column,id_folder,parent_id_folder)。列有很多空NULL时是否会有性能下降? – Jane 2010-10-22 17:43:10

+0

你不应该有巨大的性能下降。你可以添加一个索引的外键,如果这有助于某些查询... – 2010-10-22 17:46:23

+0

谢谢,它有帮助! – Jane 2010-10-22 17:47:42

2

是,一个外键,可向接受NULL值:如果一个外键设置为接受NULL值与否并不影响

CREATE TABLE folders (
    id   int NOT NULL PRIMARY KEY, 
    parent_id int NULL, 
    FOREIGN KEY (parent_id) REFERENCES folders (id) 
) ENGINE=InnoDB; 
Query OK, 0 rows affected (0.06 sec) 

INSERT INTO folders VALUES (1, NULL); 
Query OK, 1 row affected (0.00 sec) 

执行时间。


UPDATE:进一步下面评论:

请记住,B树索引是最有效的高基数数据(即有许多可能的值列,其中在列中的数据是独特的或几乎独一无二的)。如果您将有许多值(或任何其他重复的值),查询优化器可能会选择不使用索引来筛选结果集的记录,因为它不会更快。但是,这个问题与列是外键还是不外键无关。

+0

但在查询中,如果我的列有很多空NULL?或者创建id = 0的假文件夹根目录? – Jane 2010-10-22 17:46:28