数据库设计规则要遵循的程序员
我们正在研究使用Google Maps API在地图上显示点的地图绘制应用程序。 所有积分目前都从MySQL数据库中提取(持有5M +记录)。 目前,所有实体都存储在单独的表格中,其属性表示各个属性。
这提出了以下问题:
每当有新的属性时,我们都必须对数据库,应用程序代码和前端进行更改。 这一切都很好,但必须为所有实体添加一些属性,这样当它成为通过50多个不同表格并添加新属性的噩梦时。
没有办法找到共享任何特定财产的所有实体,例如没有办法找到所有具有地理部门的学校/大学或大学(没有单独查询学校,大学和学院)。
去除财产同样痛苦。
在个别表格中没有定义属性的标准。 相同的属性可以在另一个表中以不同的名称或数据类型存在。
没有办法根据它们的属性链接或分组点(以某种方式与点2相关)。
我们正在考虑重新设计整个数据库,但是如果没有DBA的帮助和缺乏专业的数据库设计经验,我们真的很挣扎。
我们在新设计中遇到的另一个问题是实体之间有很多共享属性/属性。
例如:
一个名为“ 大学 ”的实体有100多个属性。 其他实体(例如医院,银行等)与大学有很多共同点,例如ATM机,停车场,自助餐厅等。
我们真的不想在单独的表中有属性[然后将它们链接回实体w /外键],因为它需要我们手动添加/删除。 另外概括属性将导致包含50多个属性的组。 并非所有记录(即实体)都需要这些属性。
因此,牢记这一点就是我们对新设计的想法:
为每个实体分别包含一些基本信息,例如id,名字等等
有2个表属性类型和属性来存储属性信息。
使用多对多关系将每个实体 (或者如果你喜欢的表)链接到属性 。
将地址存储在不同的表中,称为地址通过外键链接实体。
我们认为这会让我们在添加,删除或查询属性时更加灵活。
然而,这种设计会在获取数据时增加连接数量,例如显示给定大学的所有“ 属性 ”,我们可能会通过20多个连接查询来获取单行中的所有相关属性。
我们迫切需要了解这种设计方法中的一些观点或可能的缺陷。
谢谢你的时间。
在试图概括你的问题而没有更具体的例子时,很难真正批评你的方法。 如果您想进行更深入的分析,请尝试掀起一个ER图表。
如果您的数据模型变化如此之大以至于您不断添加/删除属性并且其中许多属性重叠,那么使用EAV可能会更好。
否则,如果您想维护关系方法但发现与属性重叠很多,则可以分析实体并查找链接到它们的抽象。
例如)我的Db有小狗,小猫和海象都具有hasFur和furColor属性。 从3个表中删除这些属性并创建一个FurryAnimal表,链接到这3个表中的每一个。
当然,最简单的答案是不要触摸数据模型。 相反,在可用于解决(5),(4)和(2)的基础表上创建视图,
1不能成为问题。 有一个地方你的对象被定义。 其他一切都是由此产生/派生的。 只是重构你的代码,直到这种情况。
2是通过使用元模型来解决的,其中描述了哪些属性在哪里。 这可能也需要1个。
您可能希望完全避免此问题,方法是在面向Gemstone对象的数据库上使用Seaside对Smalltalk进行编程。 然后,您可以只拥有带有集合的对象,并且不需要太多连接。
链接地址: http://www.djcxy.com/p/70619.html上一篇: Database design rules to follow for a programmer
下一篇: Defining multiple foreign keys in one table to many tables