只查找一对一关系的表格?

时间:2012-03-09 18:05:43

标签: php mysql database-design entity-relationship lookup-tables

使用查找表仅在表之间存储 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

很多NULLempty字段看起来很丑陋。

或者您是否有其他更好的解决方案/实践?

4 个答案:

答案 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..)

你为什么不使用它?