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