Sql 设计本身并不坏。也许其他解决方案的性能更高,但这个解决方案似乎更具可读性和逻辑性。这只是对联接表的可选查询
另一个答案是以性能/重复性换取可读性(这不是一件坏事,取决于您在应用程序中依赖此条件的时间、您将使用它的查询数量以及您拥有的城市数量)Sql 设计本身并不坏。也许其他解决方案的性能更高,但这个解决方案似乎更具可读性和逻辑性。这只是对联接表的可选查询,sql,database,database-design,Sql,Database,Database Design,另一个答案是以性能/重复性换取可读性(这不是一件坏事,取决于您在应用程序中依赖此条件的时间、您将使用它的查询数量以及您拥有的城市数量) 为了可读性和不重复性,最好将这些条件集中在一个SQL函数中,该函数接受一个字符串参数并根据输入返回所有位置(但以性能为代价).我会同意你的答案,并说我并不觉得每次客户检查他是否按城市或地点搜索,或者什么都不搜索,这很可怕。这将是后端代码的角色,根据他选择的选项,总是会导致不同的查询 但我会从Continental表中删除“None”、“Global”,并在未选择
为了可读性和不重复性,最好将这些条件集中在一个SQL函数中,该函数接受一个字符串参数并根据输入返回所有位置(但以性能为代价).我会同意你的答案,并说我并不觉得每次客户检查他是否按城市或地点搜索,或者什么都不搜索,这很可怕。这将是后端代码的角色,根据他选择的选项,总是会导致不同的查询 但我会从Continental表中删除“None”、“Global”,并在未选择这些选项时使用其他查询。您将得到3个可能的SQL查询,我认为这本身并不是一个糟糕的设计。也许其他解决方案的性能更高,但这个解决方案似乎更具可读性和逻辑性。这只是对联接表的可选查询 另一个答案是以性能/重复性换取可读性(这不是一件坏事,取决于您在应用程序中依赖此条件的时间、您将使用它的查询数量以及您拥有的城市数量)
为了可读性和不重复性,最好将这些条件集中在一个SQL函数中,该函数接受一个字符串参数并根据输入返回所有位置(但以性能为代价)。此位置表的目标是什么?也许一个具有自外键的表是更好的解决方案,或者不同类型位置的不同表更好。如果没有更多的背景,很难说“无”和“全球”有什么区别?@mcNets:我认为“无”只意味着一个城市。您正在使用什么RDBMS?请举例说明如何使用这些表?此表的目标是什么?也许一个具有自外键的表是更好的解决方案,或者不同类型位置的不同表更好。如果没有更多的背景,很难说“无”和“全球”有什么区别?@mcNets:我认为“无”只意味着一个城市。您正在使用什么RDBMS?你能举例说明一下你打算如何使用这些表格吗?你介意详细说明一下这个答案吗?这似乎是最简单的解决方案,但我不完全理解它是如何工作的。谢谢。你介意详细说明一下这个答案吗?这似乎是最简单的解决方案,但我不完全理解它是如何工作的。非常感谢。
location_table
location = charfield(200) # New York, London, Tokyo
Global = select every location
Asia = select every location in Asia
US = select every location in US
Current system = London (etc.)
location_table
location = charfield(200) # New York, London, Tokyo
continent = foreign key to continent_table
continent_table
continent = charfield(50) # "None", "Global", Asia, Europe
get continent
if continent is global, select everything from location_table
else if continent is none, select location from location_table
else select location from location_table where foreign key is continent
0 -> None
00 -> Global
001 -> Europe
002 -> Asia
003 -> Africa
select location from location_table where continent like '[value]%'
World ID = '0' (1 digit)
Europe ID = '01' (First digit World + Second digit Europe)
Asia ID = '02'
America ID = '03'
...
England ID = '0101' (World + Continent + Country)
Deutchland ID = '0102'
....
Texas ID = '0301'
....
Yorkshire ID = '010101' (World + Continent + Country + Region)
....
London ID = '01010101' (World + Continent + Country + Region + City)
WHERE Region like '0%' --> The whole world
WHERE Region like '02%' --> Asia
WHERE Region like '01010101%' --> London
WHERE Region like '02%' AND Region like '01%' --> Asia & Europe
LocationID Name ParentLocationID LocationType
------------------------------------------------------------------
1 Planet Earth NULL Planet
2 Africa 1 Continent
3 Antartica 1 Continent
4 Asia 1 Continent
5 Australasia 1 Continent
6 Europe 1 Continent
7 North America 1 Continent
8 South America 1 Continent
9 United States 7 Country
10 Canada 7 Country
11 Mexico 7 Country
12 California 9 State
13 San Diego 12 City
14 England 6 Country
15 Cornwall 14 County
16 Truro 15 City
DECLARE @LocationID INT = 7; -- NORTH AMERICA
WITH LocationCTE AS
( SELECT l.LocationID, l.Name, l.ParentLocationID, l.LocationType
FROM dbo.Location AS l
WHERE LocationID = @LocationID
UNION ALL
SELECT l.LocationID, l.Name, l.ParentLocationID, l.LocationType
FROM dbo.Location AS l
INNER JOIN LocationCTE AS c
ON c.LocationID = l.ParentLocationID
)
SELECT *
FROM LocationCTE;
LocationID Name ParentLocationID LocationType
-----------------------------------------------------------------
7 North America 1 Continent
9 United States 7 Country
10 Canada 7 Country
11 Mexico 7 Country
12 California 9 State
13 San Diego 12 City