我正在尝试设计一个位置查找,用户可以在其中指定任何所需精度级别的位置。例如。国家,州,市,自治市等国家之一,
我使用了一个公共位置表,然后将其用于查找动态选择的表名,但是想知道是否有可行的替代方法来执行此操作。
alt text http://img386.imageshack.us/img386/3842/locationschemadh6.png
编辑分层表看起来像是要走的路。谢谢你的提示。
答案 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
表中,然后您根本不需要city
和state
表。
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&城市表?