Database design MySQL:复杂的数据结构和查询

Database design MySQL:复杂的数据结构和查询,database-design,mysql,Database Design,Mysql,我在为以下(相当复杂的)数据结构创建数据库表时遇到了一点困难,我希望有比我更有经验的人能提供帮助。我遇到麻烦的主要原因是规范化和不惜一切代价避免查询内部循环 location 1 (location_group_name, owner_id, admin_id) location 1.1 (name, address) location 1.1.1 (name) // DEVICE LIST device 1 (manufacturer_id, mo

我在为以下(相当复杂的)数据结构创建数据库表时遇到了一点困难,我希望有比我更有经验的人能提供帮助。我遇到麻烦的主要原因是规范化和不惜一切代价避免查询内部循环

location 1 (location_group_name, owner_id, admin_id)
  location 1.1 (name, address)
     location 1.1.1 (name)
        // DEVICE LIST
        device 1 (manufacturer_id, model_id, serial, purchase_date, service_date)
            Battery (manufacturer_id, model_id, purchase_date, service_date)
            Accesory 1 (manufacturer_id, model_id, purchase_date, service_date)
            Accesory 2 (...)
            Accesory n (...)
        device 2
            Battery
            Accesory 1
            Accesory 2
            Accesory n
        device n

        // STAFF LIST
        person 1 (name, email)
           qualification 1 (type, date)
           qualification 2 (...)
           qualification n (...)
        person 2
        person n
     location 1.1.2
     location 1.1.n
  location 1.2
  location 1.n
location 2
location n
我目前正在考虑将每个设备和人员作为一个序列化的多维数组插入,但我不确定这是否有效,因为cron作业脚本每天都会检查
service\u date
字段,并在满足某些标准的情况下向位置组的管理员和所有者发送自动电子邮件。为了使事情进一步复杂化,在召回的情况下,还应该通过
模型
搜索设备数据,或者通过
序列号
快速查找设备数据,以防用户添加了大量设备和/或不确切知道其位置

如果没有太多问题,我还希望看到一个针对所提议的数据结构的查询示例(只是因为我认为它可能会使用连接,而且我对它们非常不熟悉)

另外,如果您需要任何额外的信息,请随时询问,我将很乐意详细说明


提前感谢您,如有任何意见,我们将不胜感激

看起来位置1.1.1和设备之间以及位置1.1.1和人员之间存在一对多关系。我认为您将以循环查询结束,或者您将执行一些大型查询并循环以将它们合并在一起


不要因为在循环中查询而惊慌失措。对于准备好的语句,它们不必那么慢。

我不完全确定您在这里要做什么,但为什么要使用所有层次结构?这是某种商店/设备/员工模式,对吗?在关系数据库中,您可以将离散信息分离到它们自己的部分,并将它们关联到其他表中。因此,如果你有商店/设备/员工,你可以有一个“商店”表、“设备”表、“所有者”表、“员工”表、“商店/员工”表、“所有者/商店”表、“设备/商店”表(你可以跟踪其中的库存)、一个“员工/资格”表,以此类推。

是否总是有3层位置?也许拿一块白板,开始画出你认为你需要的关系(然后迭代寻找问题)…是的,总是会有3层位置。我画了它,但我总是查询内部循环,这是不可能的,因为无法控制将插入多少位置/设备/人员,而且查询内部循环一开始就有缺陷。我不是SQL专家,我构建的基于数据库的应用程序不到十个,但我不认为有必要在这里查询内部循环;你的结构几乎完全是“分层的”(不确定这是否是只有一个父母的官方说法)。你能详细说明你预见到的问题吗?除非我在这里遗漏了什么,否则不查询内部循环的唯一方法是每个设备行是否包含所有信息(从位置到管理员和所有者,到配件、电池、制造商等等)这将导致标准化的严重失败。您可以使用
JOIN
s来完成这一切。您可能会说这些也是循环,但它们是由SQL处理的。你能不能给我一个需要解决的问题(根据你的要求需要循环)?类似于“将位置1中位置的所有员工提供给我”或“将属于13.2.3中所售设备的所有附件提供给我”的查询?另外,请参见treeface的答案。+1同意,并且,
JOIN
s解决我所能看到的所有可能的查询。但既然商店->员工是一个->多个,你就不需要像
stores\u employees
那样制造额外的麻烦了。如果你(@FreekOne)愿意,我可以用Dia画出草图,并包括一些示例查询…哦,如果我完全误解了这个问题,请原谅,这一直是一种可能性…+1我也有,正如我在问题中所说的,我确实认为需要加入,这就是我所寻找的,唯一的问题是我从来没有做过这么复杂的事情,我真的不知道从哪里开始。层次结构实际上显示了信息在前端的显示方式,这实际上非常重要,因为可能会显示大量的数据。如果你能做到,我将不胜感激!好了,给你:MySQL Workbench甚至可以从这个图中创建一个完整的SQL文件,让你的数据库启动并运行(实际上,它可以连接到服务器并为你完成!)如果你想接收SQL或Workbench项目(你想做一些调整),请通过我的网站与我联系。@MVangest:非常感谢,这就是我要找的!如果你想把它作为一个答案和一个示例查询一起发布,我很乐意接受。密钥将是管理员id,因为位置是用户创建的,因此用户只能看到自己的位置。