Có 2 bảng, "Tổ chức" và "Khu vực"
Cho phép "Khu vực" liên kết với chính nó, tức là area_id, parent_area_id
Bằng cách này, bạn luôn liên kết Tổ chức với area_id và sau đó logic nội bộ có thể xác định xem khu vực đó được coi là Quận hay Thành phố.
Vì vậy, bây giờ bạn có
institutions (
id UNSIGNED INT NOT NULL PK AI,
area_id UNSIGNED INT NOT NULL,
name VARCHAR NOT NULL
)
và
Các khu vựcareas (
id UNSIGNED INT NOT NULL PK AI,
parent_area_id UNSIGNED INT NOT NULL DEFAULT 0,
name VARCHAR NOT NULL,
type ENUM('city','district') NOT NULL DEFAULT 'city'
)
Trường area.type là tùy chọn nhưng nếu bạn muốn xác định chúng như vậy thì đó có thể là một cách để thực hiện điều đó trong cơ sở dữ liệu (nếu không, chỉ cần giả sử rằng nếu parent_area_id =0 thì đó là thành phố, nếu không thì đó là quận)
Bằng cách này khi chọn trường, tất cả những gì bạn đang làm là
SELECT *
FROM institutions
INNER JOIN areas
ON areas.id = institutions.area_id
Bạn có thể chắc chắn 100% nơi mà area_id tổ chức liên kết đến, không có dấu chấm hỏi về việc có nên chuyển đến bảng Quận hoặc Thành phố hay không, nó chắc chắn sẽ chuyển đến bảng khu vực lần lượt xử lý các Quận và Thành phố theo cùng một cách và trình bày thông tin trong một định dạng mà giao diện người dùng của bạn sau đó có thể hiểu là thành phố hoặc quận. Tùy ý bạn có thể tiến thêm một bước nếu bạn thực sự muốn
SELECT
i.*,
COALESCE(a_parent.id,a_child.id) AS city_id,
COALESCE(a_parent.name,a_child.name) AS city_name
FROM institutions AS i
INNER JOIN areas AS a_child
ON a_child.id = i.area_id
LEFT JOIN areas AS a_parent
ON a_parent.id = a_child.parent_area_id
Ví dụ, điều đó sẽ luôn trả về tên thành phố ngay cả khi tổ chức được gắn với một quận cụ thể trong thành phố