数据库架构设计

时间:2008-11-14 22:16:46

标签: database-design

我正在尝试设计一个位置查找,用户可以在其中指定任何所需精度级别的位置。例如。国家,州,市,自治市等国家之一,

我使用了一个公共位置表,然后将其用于查找动态选择的表名,但是想知道是否有可行的替代方法来执行此操作。

alt text http://img386.imageshack.us/img386/3842/locationschemadh6.png

编辑分层表看起来像是要走的路。谢谢你的提示。

3 个答案:

答案 0 :(得分:4)

您可能会考虑以下内容:

locations
  id int
  parentId int
  name varchar(45)

从这个角度来看,您可以加载任何级别深度的任何类型的位置。

答案 1 :(得分:1)

您的设计优于多态关联,这是许多人实施的替代方案。这与你设计的相反:

CREATE TABLE location (
  id         INT PRIMARY KEY,
  table_name VARCHAR(45) NOT NULL CHECK (table_name in ('city', 'state')),
  table_id   INT NOT NULL -- matches an id in either city or state
);

关于您的设计,一个潜在的缺点是您无法强制执行location.table准确指示包含对location的引用的表。所以你不妨放弃那一列,而是依赖于加入两个表。

例如,要为选择列表生成标签:

SELECT l.id, COALESCE(s.name, c.name, 'Unknown Location') AS name
FROM location AS l
  LEFT OUTER JOIN state AS s ON (l.id = s.location_id)
  LEFT OUTER JOIN city AS c ON (l.id = c.location_id);

Chris Lively开始建议使用分层表。我认为他意味着您将状态和城市存储在location表中,然后您根本不需要citystate表。

CREATE TABLE location (
  id         INT PRIMARY KEY,
  loc_type   VARCHAR(45) NOT NULL CHECK (table_name in ('city', 'state')),
  loc_name   VARCHAR(45) NOT NULL,
  parent_id  INT, -- NULL if root of tree
  FOREIGN KEY (parent_id) REFERENCES location(id)
);

还有其他方法可以在SQL中存储层次结构,但如果您只有一个深度级别,那么这种设计就足够了。

答案 2 :(得分:0)

我发现这个设计存在一些问题(因为我完全不了解你的要求): 1.您将无法使用简单连接。 2.无法优化查询,因为没有索引

替代# 你有没有考虑在位置表中找到locationid并且有一个链接(一对多)到State&城市表?