具有(My)SQL数据库的分层结构

时间:2016-04-13 09:51:39

标签: mysql sql data-structures

我想创建一个网站,其中的项目仅在特定区域/地区可用。 可通过以下模式选择这些项目可用的区域/位置:

  1. 要么选择了州,否则该项目在全国范围内可用。
  2. 对于每个选定的州,可能会选择县,否则可以在州范围内使用。
  3. 对于每个县,可能会选择城市,否则可以在全县范围内使用。
  4. 等等......你可能有了这个主意。

    现在我的问题是你如何使用MySql DB实现这样的结构?或者是否有更好的数据库模型和合适的GUI? (那将是完美的) 物品数量相当少(~20)。

    当顾客访问该页面时,他将输入他的位置,并列出可用于其位置的每个项目。 如何为此目的查询?

    非常感谢, FLO

2 个答案:

答案 0 :(得分:1)

您可以使用以下列创建表格locations

id | type | name        | parent_id
 1 |    1 | State 1     |         0
 2 |    1 | State 2     |         0
 3 |    2 | County 1    |         1
 etc

在此示例中,县1属于州1,“id 0”假定为“全国范围”。

使用该模型,创建用于设置项目可用性的GUI非常简单:首先按parent_id = 0进行查询并将其作为列表提供,并使用其他nationwide作为默认选项;如果选择了某个州,则会生成另一个列表,使用选定的ID作为parent_id并提供state wide作为默认选项等。用户点击“保存”后,获取最深级别id和将其作为location_id保存在项目表中。

但是,当涉及到实际获取项目列表时,它变得不那么简单了。例如,如果您的用户说他的位置是County 1,那么您应该返回具有location_id = 3,1或0的项目的组合结果,并通过parent_id向上移动树。如果您使用了支持递归查询的RDBMS,则可以在单个查询中获取这些查询; MySQL不支持,所以你必须通过创建一个循环来查询具有特定位置ID的items,然后从位置选择parent_id,并重复查询。 / p>

否定的一面是您不能使用该结构控制树的完整性。也就是说,您无法控制城市只能将县作为父级 - 尽管您可以创建插入/更新触发器来帮助解决这个问题。也可以创建一个循环(通过将项目相互教育),这可能会导致问题。

答案 1 :(得分:1)

Here您可以找到针对该问题的不同方法的相当详细的解释。基本上你的选择是a)构造一个ParentID / ChildID树,或b)一个嵌套集。因为,虽然其他rdbms系统支持递归MySQL没有(至少没有使用精心设计的存储过程),特别是因为你的数据似乎是非常静态的,即不会真正改变很多;我建议你采用嵌套方式。它会让你更轻松。