Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.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
Php 数千个城市与用户的关系,正确的方式是什么?_Php_Mysql_Database - Fatal编程技术网

Php 数千个城市与用户的关系,正确的方式是什么?

Php 数千个城市与用户的关系,正确的方式是什么?,php,mysql,database,Php,Mysql,Database,在一个应用程序中,允许用户选择所需的位置/城市。城市列表将采用树形结构,并带有复选框,如: [x]Country -[x]State 1 --[x]City 1 --[x]City 2 --[x]City 100 -[X]State 2 --[x]City 1 --[x]City 2 --[x]City 100 [x]Country 2 现在,若用户选择国家,那个么他将拥有所有的州和城市。如果选择一个或多个州和这些州,城市和国家也将为该用户存储。用户可以选择一个或多个国家/地区。用户还可以取

在一个应用程序中,允许用户选择所需的位置/城市。城市列表将采用树形结构,并带有复选框,如:

[x]Country
-[x]State 1
--[x]City 1
--[x]City 2
--[x]City 100
-[X]State 2
--[x]City 1
--[x]City 2
--[x]City 100
[x]Country 2

现在,若用户选择国家,那个么他将拥有所有的州和城市。如果选择一个或多个州和这些州,城市和国家也将为该用户存储。用户可以选择一个或多个国家/地区。用户还可以取消选中任何一个所需的城市或州

您建议如何存储和检索数据。我正在使用MySql和Php。 查找表是否理想?或者我可以在文本类型列中对所有位置id进行汇总并以json格式存储


谢谢

我认为这取决于您需要如何访问存储的数据。如果只根据提交数据的用户查找数据,那么可能没有理由不能将序列化的树数据(即JSON、PHP serialize等)存储在与用户关联的数据库记录中。顺便说一句,这也是NoSQL数据存储的一个很好的用例

但是,如果您需要能够(比如)查找选择了特定国家、州或城市的所有用户,那么您需要存储数据,以便以这种方式查询数据。这可能意味着为国家、州和城市提供单独的表格,其中包含将用户关联到每个国家、州和城市的表格,也可能只是指一个单一的辖区表格,该表格允许不同类型的辖区以及将用户关联到辖区的表格。您处理模式的方式可能取决于您需要如何区别对待国家、州和城市,即每个辖区类型是否需要具有完全不同的属性

您建议如何存储和检索数据。我正在使用MySql和Php。查找表是否理想

要存储国家、州和城市,应该使用规范化数据库模式。国家有国家。各州都有城市。你需要连接表

或者我可以在文本类型列中对所有位置id进行汇总并以json格式存储

不,那不是正常的形式。这会造成很多问题。您无法轻松执行CRUD操作

数据库模式 现在,您可以在这些表上运行任何不同类型的查询。假设用户已选择城市1、城市2、国家/地区1和州stt2

询问 查找用户选择的所有城市。 查找用户选择的所有状态。 更新1 如何维护与用户的关系

你需要。只需创建其中3个

create table users(name varchar(100) primary key);
CREATE TABLE user_countries 
  ( 
     user    VARCHAR(100), 
     country VARCHAR(100), 
     PRIMARY KEY (`user`, `country`), 
     FOREIGN KEY (`user`) REFERENCES `users`(`name`)
     FOREIGN KEY (`counry`) REFERENCES `countries`(`name`)    
  ); 
CREATE TABLE user_states 
  ( 
     user    VARCHAR(100), 
     state   VARCHAR(100), 
     PRIMARY KEY (`user`, `state`), 
     FOREIGN KEY (`user`) REFERENCES `users`(`name`) 
     FOREIGN KEY (`state`) REFERENCES `states`(`name`)    
  ); 
CREATE TABLE user_cities 
  ( 
     user    VARCHAR(100), 
     city    VARCHAR(100), 
     PRIMARY KEY (`user`, `city`), 
     FOREIGN KEY (`user`) REFERENCES `users`(`name`) 
     FOREIGN KEY (`city`) REFERENCES `cities`(`name`)    
  );

我建议只存储选定的值,然后派生其余的值。是的,检索数据会有点痛苦,但会有几个显著的好处:

当您的源数据发生变化时,它将继续保持准确:假设您在苏联解体时运行了这个应用程序。你将你的苏联条目转换为俄罗斯,并将一些国家转换为国家。对于您的模型,这将导致大量用户数据发生更改。但是,使用衍生模型,这将变得简单得多。当城市被指定到适当的国家/地区时,任何选择了城市的人都会被自动固定。一群选择了一个州的人可能突然发现他们选择了一个国家,但是低于这个水平的城市会自动固定下来


它将简化您的创建、更新和删除操作:每次更改都只影响一行,而不是写入数百行或数千行。

要格式化代码块,请突出显示它和ctl-k,或单击编辑器中的{}按钮。反勾号用于内联代码,不适用于多行块。感谢您的编辑,我对此不太熟悉。我需要对其执行所有CRUD操作。但是,您不认为使用查找表会使它变得臃肿吗?您需要一些机制来确定用户和所选辖区之间的关系。如果您对这些表进行了适当的索引,那么性能应该会很好。谢谢,但我的问题是如何维护它与用户的关系?谢谢您的快速响应。您对将其存储为json对象有何看法?
SELECT ct.name 
FROM   cities AS ct 
       JOIN states AS st 
         ON ( st.name = city.state ) 
       JOIN countries AS cn 
         ON ( cn.name = st.country ) 
WHERE  ct.name IN ( 'city1', 'city2' ) 
        OR cn.name = 'cntry1' 
        OR st.name = 'stt2'; 
SELECT st.name 
FROM   states AS st 
       JOIN countries AS cn 
         ON ( cn.name = st.country ) 
WHERE   OR cn.name = 'cntry1' 
        OR st.name = 'stt2'; 
create table users(name varchar(100) primary key);
CREATE TABLE user_countries 
  ( 
     user    VARCHAR(100), 
     country VARCHAR(100), 
     PRIMARY KEY (`user`, `country`), 
     FOREIGN KEY (`user`) REFERENCES `users`(`name`)
     FOREIGN KEY (`counry`) REFERENCES `countries`(`name`)    
  ); 
CREATE TABLE user_states 
  ( 
     user    VARCHAR(100), 
     state   VARCHAR(100), 
     PRIMARY KEY (`user`, `state`), 
     FOREIGN KEY (`user`) REFERENCES `users`(`name`) 
     FOREIGN KEY (`state`) REFERENCES `states`(`name`)    
  ); 
CREATE TABLE user_cities 
  ( 
     user    VARCHAR(100), 
     city    VARCHAR(100), 
     PRIMARY KEY (`user`, `city`), 
     FOREIGN KEY (`user`) REFERENCES `users`(`name`) 
     FOREIGN KEY (`city`) REFERENCES `cities`(`name`)    
  );