2011-02-16 222 views
1

我一直在寻找通过谈论从数据库中选择的层级内容的帖子,但我仍然对我怎么能实现以下疑点: 我有三个表:层次数据库菜单

  • 位置:我在这里存储一个位置和它的代理商家长(例如欧洲 - >英国 - >伦敦)。
  • 建筑物:在这里我存储建筑物。一座建筑物必须位于同一个位置。
  • 用户位置:在这里我存储特定用户将能够看到的位置。
  • 用户建筑物:在这里,我存储了特定用户将能够看到的建筑物。

请注意,管理员可以这样说:“用户1将看到来自日本的所有建筑物,并且他将能够从法国看到那个特定建筑物,但只有那一个”。

有了这一切,我想建立一个菜单(特定用户),将是这样的:

  • 建筑
    • 欧洲
      • 德国
        • 慕尼黑
          • Building_1
          • Building_2
      • 英国
        • 伦敦
          • Building_3

我对如何获取该信息有所疑虑,我将不胜感激。

编辑:

表结构:

1)建筑

  • ID(主键)
  • 名称,描述,...
  • LOCATION_ID(外键位置表)
  • Company_ID(公司表的外键..建筑物必须属于j一家公司)。

2)地点

  • ID(主键)
  • 名称
  • 父ID(外键表本身..如:伦敦条目将有一个外键进入英国。

3)公司

  • ID(主键)
  • 名称,说明...

4)用户

  • ID(主键)
  • COMPANY_ID(外键公司该用户(一个用户只属于一个公司)。

5)用户建筑物

  • Id_User(外键,用户表)
  • Id_Building(外键,建筑表)

6)用户位置

  • Id_User(用户表的外键)
  • Id_Location(位置表的外键)

这个想法是公司可以分配用户可以看到的建筑物。公司可以分配特定的建筑物(不依赖于位置),这就是为什么存在用户建筑物表格,并且他们也可以分配一个位置,以便用户可以看到属于该位置的所有建筑物。

感谢您的意见,我希望我已经澄清了一点。

谢谢。

+0

关于在MySql中存储分层数据,请参阅http://dev.mysql.com/tech-resources/articles/hierarchical-data。html – 2011-02-16 07:43:55

+0

你可以告诉我们你的表格结构,也许可以组成一些演示数据吗? 这个问题只是关于存储和检索数据。 – Bajrang 2011-02-21 17:36:44

回答

1

如果您想坚持使用您当前的数据库架构,问题在于地点似乎没有固定的级别数量,所以您将不得不做一个丑陋的循环来获取user_location.id_location及其建筑物的子楼层。 如果您可以区分有意义的类别(如地区,国家,城市)的位置级别,这将有很大帮助。这样,你能有这样一个表定义:

CREATE TABLE buildings (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(255) NOT NULL, 
    ... 
    region_id INTEGER UNSIGNED NOT NULL, 
    country_id INTEGER UNSIGNED NOT NULL, 
    city_id INTEGER UNSIGNED NOT NULL, 
    PRIMARY KEY (id), 
    INDEX (region_id), 
    INDEX (country_id), 
    INDEX (city_id), 
    FOREIGN KEY (region_id) REFERENCES locations(id) ON DELETE RESTRICT, 
    FOREIGN KEY (country_id) REFERENCES locations(id) ON DELETE RESTRICT, 
    FOREIGN KEY (city_id) REFERENCES locations(id) ON DELETE RESTRICT 
) TYPE=InnoDB; 

CREATE TABLE user_location (
    user_id INTEGER UNSIGNED NOT NULL, 
    location_id INTEGER UNSIGNED NOT NULL, 
    PRIMARY KEY (user_id, region_id, country_id, city_id), 
    INDEX (user_id), 
    INDEX (location_id), 
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, 
    FOREIGN KEY (location_id) REFERENCES locations(id) ON DELETE CASCADE 
) TYPE=InnoDB; 

然后你可以检索你的建筑是这样的:

SELECT * FROM buildings WHERE id IN (
    (SELECT building_id FROM user_buildings WHERE user_id = ?) 
    UNION 
    (SELECT id FROM buildings 
    LEFT JOIN user_location ON 
    (user_location.location_id = buildings.region_id 
     OR user_location.location_id = buildings.country_id 
     OR user_location.location_id = buildings.city_id) 
    WHERE user_id = ?) 
); 

返回的行会包含你需要建立你的树的信息。