使用查找表仅在表之间存储 1:1关系是一种好习惯吗?
例如
system
表
system_id
name
etc
path
表
path_id
value
查找表 - system_has_path
表,
system_id
path_id
我有其他表格与path
表格链接,例如,
page
表,
page_id
title
etc
page_has_path
的查找表,
page_id
path_id
page
项/行或system
项/行始终只有每行一个路径。当然有时他们没有任何路径,这就是我想将路径分成独立表的原因。
我使用查找表的原因是我不希望在path
表中存储FK并以此结束,
path_id value page_id system_id post_id news_id
1 a.php 1 NULL NULL NULL
2 b.php NULL 1 NULL NULL
3 c.php NULL 2 NULL NULL
很多NULL
或empty
字段看起来很丑陋。
或者您是否有其他更好的解决方案/实践?
答案 0 :(得分:2)
与其他答案相反,是的,这是(大多数)标准化方法。优点:
您的专栏中没有Null。
如果您以后想要将另一个表中的外键引用添加到system_has_path
(具有路径而不是任何系统的系统)或page_has_path
,您可以轻松地执行此操作,而不更改现有表格。
答案 1 :(得分:1)
我没有看到使用单个表有任何问题(即使里面有很多NULL
个值)。这种方法可以使您不必在JOIN
次查询中添加额外的SELECT
。
您可以使用多个查找表,但在两个FK列上使用UNIQUE
索引以防止重复(因为您声明您的关系都是一对一的)。
答案 2 :(得分:0)
如果你只是为了防止你的path_id列中的NULL值,那么我说,不要担心NULL值。
但是,如果为了规范化而不介意复杂性,并希望将路径保留在自己的表中,但不希望连接表为1对1的关系,那么请考虑以下方法。
主键为(id, path_type)
:
path table
----------------
id path_type value
1 page a.php
1 system b.php
2 system c.php
以下是对此的查询:
SELECT *
FROM page
LEFT JOIN path
ON path.id = page.page_id AND path.path_type = 'page'
答案 3 :(得分:-1)
据推测,你的帖子表(例如)是:
posts(id, path_id, etc..)
你为什么不使用它?