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`)
);