Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 数据库模式设计_Database Design - Fatal编程技术网

Database design 数据库模式设计

Database design 数据库模式设计,database-design,Database Design,我试图设计一个位置查找,用户可以指定一个位置到任何期望的精度水平。国家、州、市、自治区等之一 我使用了一个公共位置表,然后将在动态选择表名的查找中使用该表,但我想知道是否有可行的替代方法来实现这一点 编辑层次结构表似乎是一条可行之路。谢谢你的提示。 < P>你可以考虑一些类似的事情: locations id int parentId int name varchar(45) 从这个角度来看,您可以加载任何级别深度的任何类型的位置 我认为这种设计存在一些问题(因为我不完全了解您的

我试图设计一个位置查找,用户可以指定一个位置到任何期望的精度水平。国家、州、市、自治区等之一

我使用了一个公共位置表,然后将在动态选择表名的查找中使用该表,但我想知道是否有可行的替代方法来实现这一点


编辑层次结构表似乎是一条可行之路。谢谢你的提示。

< P>你可以考虑一些类似的事情:

locations
  id int
  parentId int
  name varchar(45)

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

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

交替#
您是否考虑过在location表中使用locationid,并在State&City表中使用链接(一对多)?

您的设计比多态关联更好,多态关联是许多人实现的替代方案。这与你的设计正好相反:

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
);
关于您的设计,一个潜在的弱点是您无法强制执行该
位置。表
准确地指示包含对
位置的引用的表。因此,您不妨删除该列,转而依赖于连接到两个表

例如,要为拾取列表生成标签,请执行以下操作:

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开始建议使用分层表。我认为他的意思是,你将州和城市都存储在
位置
表中,然后你根本不需要
城市

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中也有其他存储层次结构的方法,但是如果您只有一个深度级别,这种设计就足够了。

您将无法使用这种结构查询一组位置(例如,查找所有城市)。也许您还可以添加“类型”。这与用户故事的元素范围(“任何位置描述”)和数据存储相匹配。只要用户没有指定他们需要的格式(城市、州、城市和州),在数据库中分解它并没有多大好处,只是会使它变得更复杂。您可以添加“IsState”布尔值和“State”列,然后从较低分辨率的名称进行自联接。您可能希望预测的不仅仅是城市,还有公园、县和其他地理实体。我认为location表中的“Id”列实际上是一个location Id,引用该链接的外键已经在其他两个表中了。不幸的是,调用每个表的第一列“ID”会首先破坏使用名称的助记功能。