php - 千城万户的关系,什么才是正确的做法?

标签 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

……

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

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

谢谢!

最佳答案

How would you suggest to store and retrieve data. I'm using MySql and Php. Will a look-up table be ideal?

要存储国家、州和城市,您应该使用规范化的数据库架构。国家有州。国家有城市。您需要联结表。

OR can I grand all locations id kand store in json format in a text type column?

没有。那不是正常的形式。而且会产生很多问题。您无法轻松执行 CRUD 操作。

数据库模式

create table countires(name varchar(100) primary key);
create table sates(name varchar(100) primary key, country varchar(100), foreign key `country` references `countries`(`name`)); 
create table cities(name varchar(100) primary key, state varchar(100), foreign key `state` references `states`(`name`)); 

现在您可以对这些表运行任何不同类型的查询。假设用户选择了城市(city1city2)、国家/地区 cntry1 和州 stt2

查询

查找用户选择的所有城市。

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'; 

更新 1

how to maintain its relation with user?

你需要Junction tables .只需创建其中的 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`)    
  );

关于php - 千城万户的关系,什么才是正确的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13959018/

相关文章:

php - 谷歌地图过滤器

php - MySQL中的Strtotime查询[基本PHP页面]

sql - 单独查询计数

python - 是否可以在 Python 的 if 语句中使用变量值?

database - 融合表适合做网站数据库吗?

mysql - mysql 8.0.16中用户定义的变量将存储在哪里?

php - 使用 Laravel 5.8 验证时显示错误消息的问题

php - 在不更改当前页面的情况下运行 php 脚本的按钮

php - 优化查询SQL

php - 如何将关联数组传递给 POST 中的 php 页面?