【发布时间】:2011-05-19 08:28:10
【问题描述】:
我们正在开发一个地图应用程序,该应用程序使用 Google Maps API 在地图上显示点。目前所有点都是从 MySQL 数据库中获取的(保存大约 5M + 记录)。目前,所有实体都存储在单独的表中,其属性代表各个属性。
这会带来以下问题:
每次出现新属性时,我们都必须对数据库、应用程序代码和前端进行更改。这一切都很好,但是必须为所有实体添加一些属性,这样就变成了遍历 50 多个不同的表并添加新属性的噩梦。
无法找到共享任何给定属性的所有实体,例如无法找到所有有地理系的学校/学院或大学(无需分别查询学校、大学和学院)。
删除属性同样痛苦。
没有用于在单个表中定义属性的标准。相同的属性可以在另一个表中以不同的名称或数据类型存在。
无法根据属性(在某种程度上与第 2 点相关)链接或分组点。
我们正在考虑重新设计整个数据库,但没有 DBA 的帮助和缺乏专业的数据库设计经验,我们真的很挣扎。
我们在新设计中面临的另一个问题是实体之间有很多共享属性/属性。
例如:
一个名为“university”的实体有 100 多个属性。其他实体(例如医院、银行等)与大学共享很多属性,例如自动取款机、停车场、自助餐厅等。
我们真的不想在单独的表中拥有属性[然后将它们链接回带有外键的实体],因为这需要我们手动添加/删除。此外,泛化属性将导致包含 50 多个属性的组。并非所有记录(即实体)都需要这些属性。
因此,牢记这一点,这就是我们对新设计的想法:
每个实体都有单独的表,其中包含一些基本信息,例如id,name,etc.
有2个表attribute type和attribute来存储属性信息。
使用多对多关系将每个实体(或您喜欢的表格)链接到属性。
将地址存储在名为addresses的不同表中,通过外键链接实体。
我们认为这将使我们在添加、删除或查询属性时更加灵活。
然而,这种设计将导致在获取数据时增加连接数,例如显示给定大学的所有“属性”,我们可能有一个包含 20 多个连接的查询来获取所有相关属性在一行中。
我们迫切需要了解这种设计方法中的一些意见或可能存在的缺陷。
感谢您的宝贵时间。
【问题讨论】:
标签: database database-design relational-database