Mysql 索引国家、州、城市的困难

Mysql 索引国家、州、城市的困难,mysql,database,Mysql,Database,我计划将locationID从Locations表中指定给user表中的每个用户,这样我就不必在user表中重复输入Country、State、City,从而节省磁盘空间,而不是为共享同一位置的多个用户输入重复的用户位置。美国、CT、伍德黑文 在多个用户说第12个用户可以输入USA、NY、Albany之后,此条目被输入到位置表的第12行。当用户输入其位置信息国家、州、城市时,在输入新记录之前,我需要签入位置表以查看该记录是否存在。问题是您无法索引州和市列,因为它将分别和阿富汗、阿拉巴马、阿齐尔本

我计划将locationID从Locations表中指定给user表中的每个用户,这样我就不必在user表中重复输入Country、State、City,从而节省磁盘空间,而不是为共享同一位置的多个用户输入重复的用户位置。美国、CT、伍德黑文

在多个用户说第12个用户可以输入USA、NY、Albany之后,此条目被输入到位置表的第12行。当用户输入其位置信息国家、州、城市时,在输入新记录之前,我需要签入位置表以查看该记录是否存在。问题是您无法索引州和市列,因为它将分别和阿富汗、阿拉巴马、阿齐尔本、国家、州和城市不匹配

有没有一种有效的方法可以将州和城市与按字母顺序索引的国家名称进行排序?我希望阿富汗的州以a开头,城市以a开头,并将阿富汗作为第一行,以此类推,假设阿富汗是国家列表中的第一个国家


我相信,即使规范化的方法有一个单独的Locations表可以节省磁盘空间,但搜索记录、插入(如果尚未在Locations表中)以及在user表中插入LocationsID所需的时间在时间上也会更昂贵。我的断言正确吗?

在大多数情况下,规范化形式是最好的形式。在您的示例中,我建议您选择城市、州、国家的组合,并查看新值是否已经存在,如果不存在,请在添加用户之前创建行。这在插入时间上稍微贵一些,因为您将有两个查询,但会减少磁盘使用和选择时间

不过,您应该在城市、州和国家表上放置索引


请注意,通过这种方式,您将有相同位置的重复条目,因为慕尼黑、巴伐利亚、德国与慕尼黑、拜仁、德国相同,但您将没有机会知道。

在大多数情况下,标准化形式是最好的形式。在您的示例中,我建议您选择城市、州、国家的组合,并查看新值是否已经存在,如果不存在,请在添加用户之前创建行。这在插入时间上稍微贵一些,因为您将有两个查询,但会减少磁盘使用和选择时间

不过,您应该在城市、州和国家表上放置索引


请注意,通过这种方式,您将在同一地点有重复条目,因为慕尼黑、巴伐利亚、德国与慕尼黑、拜仁、德国相同,但您将没有机会知道。

不确定索引是否是您的问题。如果我理解正确,您将有两个表:

USERS
 - UserID
 - ....
 - LocationID


LOCATIONS
 - LocationID
 - City
 - State
 - Country
您可以预先从类似的内容填充位置,也可以在用户输入时将新位置插入表中。比如:

insert into Locations
values
(null, $city, $state, $country)
where not exists
(select * from locations 
  where city = $city 
  and country = $country 
  and state = $state) 

然后找到与插入到用户表中的相同条件匹配的locationID

不确定索引是否是您的问题。如果我理解正确,您将有两个表:

USERS
 - UserID
 - ....
 - LocationID


LOCATIONS
 - LocationID
 - City
 - State
 - Country
您可以预先从类似的内容填充位置,也可以在用户输入时将新位置插入表中。比如:

insert into Locations
values
(null, $city, $state, $country)
where not exists
(select * from locations 
  where city = $city 
  and country = $country 
  and state = $state) 
然后找到与插入到用户表中的相同条件匹配的locationID

这是数据库规范化的一个典型陷阱:仅为空间而规范化

空间很便宜

从函数依赖性的角度考虑:元组Country、State、City应该是函数依赖性,但您没有任何依赖于它的信息,也没有它的组件的信息,至少您没有告诉我们。或者,您可以具有某些功能依赖项,例如State->Country,或City->Coutry,State,但您已经知道,对于全局数据库来说,情况并非如此

你同样可以把它作为一个单一属性的国家;状态从功能依赖的角度来看,它不会影响您的设计;从搜索数据的角度来看,它可能是一个很好的选择

换句话说,如果您有任何特定于元组国家、州、城市的信息,或者您有要在元组本身中强制执行的函数依赖项,那么您可能希望规范化此表

如果不这样做,那么就不要仅仅为了空间而对其进行规范化。空间从来不是规范化更新/插入/删除背后的主要动机异常是主要原因

这样说吧。为了节省空间,你会规范化一个人的名字和姓氏吗

如果您仍然想这样做,那么就不用担心索引如何对数据进行排序。那不应该是你担心的。你可以创建一个基于树的索引-默认-关于国家,州,城市,然后你可以搜索一个g iven country、country state或country、state、city您始终可以在基于树的索引中使用前缀。可以在具有任意属性组合的表上创建任意数量的索引。但这会占用空间,并且会减慢插入速度,但我怀疑您在该表中无论如何不会有很多

我的建议是,不要规范化这些数据

-dmg这是数据库规范化的一个典型陷阱:规范化只是为了空间

空间很便宜

从函数依赖性的角度考虑:元组Country、State、City应该是函数依赖性,但您没有任何依赖于它的信息,也没有它的组件的信息,至少您没有告诉我们。或者,您可以具有某些功能依赖项,例如State->Country,或City->Coutry,State,但您已经知道,对于全局数据库来说,情况并非如此

你同样可以把它作为一个单一属性的国家;状态从功能依赖的角度来看,它不会影响您的设计;从搜索数据的角度来看,它可能是一个很好的选择

换句话说,如果您有任何特定于元组国家、州、城市的信息,或者您有要在元组本身中强制执行的函数依赖项,那么您可能希望规范化此表

如果不这样做,那么就不要仅仅为了空间而对其进行规范化。空间从来不是规范化更新/插入/删除背后的主要动机异常是主要原因

这样说吧。为了节省空间,你会规范化一个人的名字和姓氏吗

如果您仍然想这样做,那么就不用担心索引如何对数据进行排序。那不应该是你担心的。您可以在国家、州、城市上创建基于树的索引(默认),然后可以搜索给定的国家、州或国家、州、城市。您可以始终在基于树的索引中使用前缀。可以在具有任意属性组合的表上创建任意数量的索引。但这会占用空间,并且会减慢插入速度,但我怀疑您在该表中无论如何不会有很多

我的建议是,不要规范化这些数据

-dmg

我计划将locationID从Locations表中指定给user表中的每个用户,这样我就不必在user表中重复输入Country、State、City,从而节省磁盘空间,而不是为共享同一位置的多个用户输入重复的用户位置。美国、CT、伍德黑文

你所描述的不是标准化

如果您试图规范化原始表,那么您应该在原始表中标识函数依赖项、多值依赖项或连接依赖项,并通过投影删除该依赖项

但你没有那样做。您只需选择三个密切相关的列,并用重复的ID号替换重复的文本。这不是正常化

考虑到你告诉我们的很少,唯一可能的依赖是{城市,州->国家}。这种依赖关系是否成立取决于应用程序,但在全局范围内并不成立。如果我没有记错的话,几年前,在一些阿拉伯国家和一些拉丁美洲国家的一个国家,也有类似的情况

另一方面,如果您想要一个额外的表,可以使用它来提高数据完整性,并且应用程序代码可以用来向用户呈现排序的可能性,那么这是非常简单的。但这与数据完整性有关,而不是与标准化有关

您可以像这样存储国家、州和城市。我不建议你这么做;这是一个例子。实际上,您应该认真考虑使用ISO国家代码

,国家代码 ,州代码

设置从表到表cities的外键引用

我计划将locationID从Locations表中指定给user表中的每个用户,这样我就不必在user表中重复输入Country、State、City,从而节省磁盘空间,而不是为共享同一位置的多个用户输入重复的用户位置。美国、CT、伍德黑文

你所描述的不是标准化

如果您试图规范化原始表,那么您应该在原始表中标识函数依赖项、多值依赖项或连接依赖项,并通过投影删除该依赖项

但你没有那样做。您只需选择三个密切相关的列,并用重复的ID号替换重复的文本。这不是正常化

考虑到你告诉我们的很少,唯一可能的依赖是{城市,州->国家}。这种依赖关系是否成立取决于应用程序,但在全局范围内并不成立。如果我没有记错的话,几年前,在一些阿拉伯国家和一些拉丁美洲国家的一个国家,也有类似的情况。

另一方面,如果您想要一个额外的表,可以使用它来提高数据完整性,并且应用程序代码可以用来向用户呈现排序的可能性,那么这是非常简单的。但这与数据完整性有关,而不是与标准化有关

您可以像这样存储国家、州和城市。我不建议你这么做;这是一个例子。实际上,您应该认真考虑使用ISO国家代码

,国家代码 ,州代码


设置从表到表cities的外键引用。

您也可以尝试不使用ajax调用和数据库管理:

<html>
<head> 
<title>Demo by kishan Radadiya</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  <script type="text/javascript">
    $(document).ready(function(){
        // Countries
        var country_arr = new Array("Select Country","AUSTRALIA","INDIA","NEW ZEALAND","USA","UAE","MAURITIUS");

        $.each(country_arr, function (i, item) {
            $('#country').append($('<option>', {
                value: i,
                text : item,
            }, '</option>' ));
        });

        // States
        var s_a = new Array();
        s_a[0]="Select State";
        s_a[1]="Select State|QUEENSLAND|VICTORIA";
        s_a[2]="Select State|ANDHRAPRADESH|KARNATAKA|TAMILNADU|DELHI|GOA|W-BENGAL|GUJARAT|MADHYAPRADESH|MAHARASHTRA|RAJASTHAN";
        s_a[3]="Select State|AUCKLAND";
        s_a[4]="Select State|NEWJERSEY|ILLINOIS";
        s_a[5]="Select State|DUBAI";
        s_a[6]="Select State|MAURITIUS";

        // Cities
        var c_a = new Array();
        c_a['QUEENSLAND']="BRISBANE";
        c_a['VICTORIA']="MELBOURNE";
        c_a['ANDHRAPRADESH']="HYDERABAD";
        c_a['KARNATAKA']="BANGLORE";
        c_a['TAMILNADU']="CHENNAI";
        c_a['DELHI']="DELHI";
        c_a['GOA']="GOA";
        c_a['W-BENGAL']="KOLKATA";
        c_a['GUJARAT']="AHMEDABAD1|AHMEDABAD2|AHMEDABAD3|BARODA|BHAVNAGAR|MEHSANA|RAJKOT|SURAT|UNA";
        c_a['MADHYAPRADESH']="INDORE";
        c_a['MAHARASHTRA']="MUMBAI|PUNE";
        c_a['RAJASTHAN']="ABU";
        c_a['AUCKLAND']="AUCKLAND";
        c_a['NEWJERSEY']="EDISON";
        c_a['ILLINOIS']="CHICAGO";
        c_a['MAURITIUS']="MAURITIUS";
        c_a['DUBAI']="DUBAI";


        $('#country').change(function(){
            var c = $(this).val();
            var state_arr = s_a[c].split("|");
            $('#state').empty();
            $('#city').empty();
            if(c==0){
                $('#state').append($('<option>', {
                    value: '0',
                    text: 'Select State',
                }, '</option>'));
            }else {
                $.each(state_arr, function (i, item_state) {
                    $('#state').append($('<option>', {
                        value: item_state,
                        text: item_state,
                    }, '</option>'));
                });
            }
            $('#city').append($('<option>', {
                value: '0',
                text: 'Select City',
            }, '</option>'));
        });

        $('#state').change(function(){
            var s = $(this).val();
            if(s=='Select State'){
                $('#city').empty();
                $('#city').append($('<option>', {
                    value: '0',
                    text: 'Select City',
                }, '</option>'));
            }
            var city_arr = c_a[s].split("|");
            $('#city').empty();

            $.each(city_arr, function (j, item_city) {
                $('#city').append($('<option>', {
                    value: item_city,
                    text: item_city,
                }, '</option>'));
            });


        });
    });
</script>
</head>
<body>
<select name="country" id="country"></select> <br>
<select name="state" id="state"></select> <br>
<select name="city" id="city"></select>
</body>
</html>

您也可以尝试不使用ajax调用和数据库管理:

<html>
<head> 
<title>Demo by kishan Radadiya</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  <script type="text/javascript">
    $(document).ready(function(){
        // Countries
        var country_arr = new Array("Select Country","AUSTRALIA","INDIA","NEW ZEALAND","USA","UAE","MAURITIUS");

        $.each(country_arr, function (i, item) {
            $('#country').append($('<option>', {
                value: i,
                text : item,
            }, '</option>' ));
        });

        // States
        var s_a = new Array();
        s_a[0]="Select State";
        s_a[1]="Select State|QUEENSLAND|VICTORIA";
        s_a[2]="Select State|ANDHRAPRADESH|KARNATAKA|TAMILNADU|DELHI|GOA|W-BENGAL|GUJARAT|MADHYAPRADESH|MAHARASHTRA|RAJASTHAN";
        s_a[3]="Select State|AUCKLAND";
        s_a[4]="Select State|NEWJERSEY|ILLINOIS";
        s_a[5]="Select State|DUBAI";
        s_a[6]="Select State|MAURITIUS";

        // Cities
        var c_a = new Array();
        c_a['QUEENSLAND']="BRISBANE";
        c_a['VICTORIA']="MELBOURNE";
        c_a['ANDHRAPRADESH']="HYDERABAD";
        c_a['KARNATAKA']="BANGLORE";
        c_a['TAMILNADU']="CHENNAI";
        c_a['DELHI']="DELHI";
        c_a['GOA']="GOA";
        c_a['W-BENGAL']="KOLKATA";
        c_a['GUJARAT']="AHMEDABAD1|AHMEDABAD2|AHMEDABAD3|BARODA|BHAVNAGAR|MEHSANA|RAJKOT|SURAT|UNA";
        c_a['MADHYAPRADESH']="INDORE";
        c_a['MAHARASHTRA']="MUMBAI|PUNE";
        c_a['RAJASTHAN']="ABU";
        c_a['AUCKLAND']="AUCKLAND";
        c_a['NEWJERSEY']="EDISON";
        c_a['ILLINOIS']="CHICAGO";
        c_a['MAURITIUS']="MAURITIUS";
        c_a['DUBAI']="DUBAI";


        $('#country').change(function(){
            var c = $(this).val();
            var state_arr = s_a[c].split("|");
            $('#state').empty();
            $('#city').empty();
            if(c==0){
                $('#state').append($('<option>', {
                    value: '0',
                    text: 'Select State',
                }, '</option>'));
            }else {
                $.each(state_arr, function (i, item_state) {
                    $('#state').append($('<option>', {
                        value: item_state,
                        text: item_state,
                    }, '</option>'));
                });
            }
            $('#city').append($('<option>', {
                value: '0',
                text: 'Select City',
            }, '</option>'));
        });

        $('#state').change(function(){
            var s = $(this).val();
            if(s=='Select State'){
                $('#city').empty();
                $('#city').append($('<option>', {
                    value: '0',
                    text: 'Select City',
                }, '</option>'));
            }
            var city_arr = c_a[s].split("|");
            $('#city').empty();

            $.each(city_arr, function (j, item_city) {
                $('#city').append($('<option>', {
                    value: item_city,
                    text: item_city,
                }, '</option>'));
            });


        });
    });
</script>
</head>
<body>
<select name="country" id="country"></select> <br>
<select name="state" id="state"></select> <br>
<select name="city" id="city"></select>
</body>
</html>

您想要优化什么?插入时间还是选择时间?您希望优化什么?插入时间还是选择时间?我有着完全相同的想法-除非您的数据库将包含数百万行重复的国家+州+城市组合,否则根本没有必要将其正常化+1因为数据库规范化被高估了:也许我有着完全相同的想法——除非您的数据库将包含数百万行重复的国家+州+城市组合,否则规范化就没有意义了+1因为数据库规范化被高估了:可能