对象属性索引/查找表的结构

时间:2014-05-06 15:21:41

标签: mysql sql database-design

我们有一个具有复杂,深度和多维对象的软件系统,以标准化形式存储在MySQL数据库中。我们需要能够快速根据更深层次的子对象标准集合来获取和排序顶级对象。用户将使用GUI来构建他们想要用于选择的条件,然后自动将其转换为SQL。

我们的想法是动态构建一个MEMORY表,每个对象类型一个(从真实表中加载),并在内存表中使用一组键和值,以便快速查找和排序复杂数据

这是用于说明目的的数据模型的简化示例:

   /oPlace/ID
   /oPlace/Name
   /oPlace/aoAnimals/[x]/oAnimalType/ID
   /oPlace/aoAnimals/[x]/oAnimalType/Name
   /oPlace/aoAnimals/[x]/oAnimalType/NumLegs
   /oPlace/aoAnimals/[x]/oAnimalType/CanSwim
   /oPlace/aoAnimals/[x]/oAnimalType/CanFly
   /oPlace/oPlaceType/ID
   /oPlace/oPlaceType/Name
   /oPlace/oPlaceType/IsWild
   /oPlace/oPlaceType/IsZoo

Place对象具有名称,ID和动物对象链接数组。动物具有类型,动物类型具有ID,名称和其他属性。一个地方还有一个指向PlaceType对象的链接。像oPlace到oPlaceType这样的节点有一个单独的关系,而其他节点,如oPlace到aoAnimals有很多aoAnimals。查询对象数组时,查询应将每个集看作一个集。

鉴于上面的示例,Place_Lookup表可能如下所示:

   PlaceID      Key                                                     Value
     1          /oPlace/ID                                                1
     1          /oPlace/Name                                              "Sam's Zoo"
     1          /oPlace/aoAnimals/[0]/oAnimalType/ID                      1      
     1          /oPlace/aoAnimals/[0]/oAnimalType/Name                    "Bird"
     1          /oPlace/aoAnimals/[0]/oAnimalType/NumLegs                 2
     1          /oPlace/aoAnimals/[0]/oAnimalType/CanSwim                 0
     1          /oPlace/aoAnimals/[0]/oAnimalType/CanFly                  1
     1          /oPlace/aoAnimals/[1]/oAnimalType/ID                      2
     1          /oPlace/aoAnimals/[1]/oAnimalType/Name                    "Fish"
     1          /oPlace/aoAnimals/[1]/oAnimalType/NumLegs                 0
     1          /oPlace/aoAnimals/[1]/oAnimalType/CanSwim                 1
     1          /oPlace/aoAnimals/[1]/oAnimalType/CanFly                  0
     1          /oPlace/oPlaceType/ID                                     1
     1          /oPlace/oPlaceType/Name                                   "Zoo"
     1          /oPlace/oPlaceType/IsWild                                 0
     1          /oPlace/oPlaceType/IsZoo                                  1
     2          /oPlace/ID                                                2
     2          /oPlace/Name                                              "Africa"
     2          /oPlace/aoAnimals/[0]/oAnimalType/ID                      1      
     2          /oPlace/aoAnimals/[0]/oAnimalType/Name                    "Bird"
     2          /oPlace/aoAnimals/[0]/oAnimalType/NumLegs                 2
     2          /oPlace/aoAnimals/[0]/oAnimalType/CanSwim                 0
     2          /oPlace/aoAnimals/[0]/oAnimalType/CanFly                  1
     2          /oPlace/aoAnimals/[1]/oAnimalType/ID                      2
     2          /oPlace/aoAnimals/[1]/oAnimalType/Name                    "Elephant"
     2          /oPlace/aoAnimals/[1]/oAnimalType/NumLegs                 4
     2          /oPlace/aoAnimals/[1]/oAnimalType/CanSwim                 1
     2          /oPlace/aoAnimals/[1]/oAnimalType/CanFly                  0
     2          /oPlace/aoAnimals/[2]/oAnimalType/ID                      4
     2          /oPlace/aoAnimals/[2]/oAnimalType/Name                    "Flying Tiger"
     2          /oPlace/aoAnimals/[2]/oAnimalType/NumLegs                 4
     2          /oPlace/aoAnimals/[2]/oAnimalType/CanSwim                 1
     2          /oPlace/aoAnimals/[2]/oAnimalType/CanFly                  1
     2          /oPlace/oPlaceType/ID                                     2
     2          /oPlace/oPlaceType/Name                                   "Wild"
     2          /oPlace/oPlaceType/IsWild                                 1
     2          /oPlace/oPlaceType/IsZoo                                  0

这是数据模型的简化版本,实际表格比此示例更复杂,节点更深。目标是能够快速查询,如下图所示。    查询以JSONish样式显示,客户端从GUI生成。

  1. 获取所有具有可以飞行的类型的动物的地方。

    'oPlace/aoAnimals/oAnimalType' = {'CanFly' = 1}

  2. 获取所有位于该地方的所有儿童动物都可以飞行的地方。

    'oPlace/aoAnimals' = [ALL] {'oAnimalType' = {'CanFly' = 1}}

  3. 获取所有地方(链接到IsWild的PlaceType)和(至少有1个动物链接到oAnimalType(至少有4条腿并可以飞行))

    'oPlace/oPlaceType' = {'IsWild' = 1} AND '/oPlace/aoAnimals/oAnimalType' = {'CanFly' = 1 AND 'NumLegs' >= 4}

  4. 此外,我们还打算能够ORDER BY深度值,例如:

    `ORDER BY /oPlace/aoAnimals/oAnimalType/NumLegs`
    

    ...会根据该地方动物的腿数对这些地方进行排序。

    我的具体问题:

    1. 这个表格结构是否适合我们尝试用它做什么?如果没有,替代方案?

    2. 如果是这样,什么语法适合查询嵌套分组?例如,当节点级别有多个子项如/oPlace/aoAnimals/[0]/oPlace/aoAnimals/[1]时,需要将它们视为集合,我们如何在枚举的子集中进行查询?

0 个答案:

没有答案