2011-02-19 5 views
0

저는 국가, 지역 및 도시 테이블을 연결하는 가장 좋은 방법을 찾으려고합니다.국가 지역 및 도시 테이블에 대한 MySQL 관계

내 웹 사이트에서 사용자가 마을에 들어갈 수 있기를 바랍니다. 그런 다음 국가 및 지역 (선택 사항)을 입력하거나 모두 입력해야합니다.

현재 내 테이블은

TBL > 사용자 같다 townID (FK)

> TBL 마을이 ID (PK) townName regionID (FK DEFAULT NULL)

TBL > 지역이있다 id (PK) 지역 이름 countryID (FK NOT NULL)

tbl > 국가 ID (PK) 국가 이름

내가 가능성이 더에 마을 관계에 사용자를 침으로 생각 :

TBL > 사용자가 locationID (FK)
TBL > 위치가 ID (PK) townID (FK) regionID (FK) countryID (FK)

하지만 불필요하고 문제가 더 복잡해 졌다고 생각하십니까?

국가 데이터베이스가 이미 채워져 있습니다. 나는 사용자가 입력 한 도시> 지역> 국가 관계에 대한 내 자신의 참고 문헌을 작성하려고합니다. 따라서 사용자가 지역 및 국가가없는 도시에 입장하면 지역 ID없이 동일한 이름의 도시가없는 경우 지역 ID없이 마을에 입력됩니다. 지역 및 국가 ID가 사용자에 의해 입력 된 도시의 경우도 마찬가지입니다. 들어가기 전에 이미 존재하는 마을> 지역> 국가 관계가 없는지 확인합니다. 나중에이 사이트를 개발하면서 사용자가 입력 한 도시를 기반으로 국가/지역에 대한 Ajax 제안을 제공 할 것입니다.

질문에 대한 그래서 :

나는 그런 중복 데이터 또는 데이터로 가능하게 덮어 쓰는이와 함정을 직시 할 수 있습니다. 원하는 방식으로 테이블을 구성하는 더 좋은 방법이 있습니까?

이것은 이전 질문에 의해 답변을 얻을 수 있습니다. 그러나 PHP 처리를 줄이기 위해 할 수있는 일이 있습니다. 분명히 한 PHP 문장을 삽입하는 것을 선호하지만 한 번에 너무 많은주의 사항이 있다고 생각합니다.

또한 사용자 타운 항목이 null 일 수 있으며 지역에 대한 외래 키 참조를 포함 할 수도 있고 포함하지 않을 수도 있습니다.이를 고려하여 View를 만드는 것이 가장 좋습니다.

호스팅되기 때문에 나는 MySQL 기능을 사용하지 않을 것입니다.

설명이 필요하면 알려주십시오. 계속하기 전에이 권리를 처음으로 얻고 싶습니다. 그래서 당신의 도움은 값을 헤아릴 수 없을 것입니다.

답변

0

너무 명확하기 때문에 코드를 줄인다고 생각하지 않습니다. 당신은 그것을 바꿀 수는 있지만 더 나아질 수는 없습니다.

+0

답장을 보내 주셔서 감사합니다. 생각만큼 많이, 내 SQL 기술은 가난하므로 그렇게하기 전에 손을 뻗을 것이라고 생각했습니다. View out을 정렬하지 않고는 아무 작업도 수행 할 수 없지만 사용자 타운 항목이 null 일 수 있으며 지역에 대한 FK 참조가 포함되어 있거나 포함되어 있지 않을 수 있으므로 을 고려해 볼 수 있습니다. ? tbl> users. *가 포함 된보기입니다. 그런 다음 마을, 지역 및 국가를 추가 열로 만들고 해당 테이블에서 채워진보기는 null이 아닙니다. –

+0

다음은 작동하는 것처럼 보입니다.하지만 이것은 내 머리 꼭대기에있는 것입니다. 더 좋은 방법이 있습니까? SELECT * FROM tbl_users 가입 tbl_towns on tbl_towns.id = tbl_users.birthPlace 가입 tbl_regions.id = tbl_towns.regionID 가입 tbl_countries on tbl_countries.id = tbl_regions.countryID –

0

데이터베이스가 복잡해지고 있습니다. 일단 "체인으로 연결된 선택 상자"개념을 살펴보십시오. 인터넷 검색을 통해 해결책을 찾을 수 있습니다.

+0

나는 국가> 지역> 타운 원하지 않는다. 그래도. 사용자가 원하는 경우 마을에 들어가서 그대로 둘 수 있기를 바랍니다. 스크립팅/코딩에 문제가 없지만 DB 엔진에 대한 처리를 오프로드 할 수 있다면 데이터베이스에 대한 최상의 방법이 될 것입니다. –

0

지역 및 국가가없는 도시 이름을 수락하는 것은 누군가가 중간 또는 마지막없이 이름을 입력하도록하는 것과 같습니다. 데이터이지만 식별자가 아닙니다.

풀러 턴의 정식 명칭은 "미국 캘리포니아 주 풀러 턴 (Fullerton, California, USA)"입니다. 풀러 턴의 성명을 요구하지 않으면 데이터 무결성을 위해 외래 키를 포기하게됩니다. ("미국 캘리포니아 주 풀러 턴 (Fullerton, California, USA)"도시는 "미국 알라바마 풀러 턴 (Fullerton, Alabama, USA)"입니다.) 행운을 빈다.

이 경로를 사용하는 경우 가장 유용한 조언은 ID 번호를 제거하는 것입니다. ISO는 국가의 국가 및 구획에 대한 표준 코드를 게시합니다. 너는 Wikipedia에서 그들을 찾을 수있다. 자연 키를 저장하면 조인 수가 3에서 0으로 줄어 듭니다. 0 조인은 거의 항상 3 조인을 수행합니다.

아마도 외부 조인을 사용하여보기를 만들어야 할 것입니다.