我正在研究数据库结构,并试图想象将大量相关记录拆分成表格的最佳方法。所有记录都具有相同的基本类型,但每个记录都会根据其特定用途进行扩展。
每种类型都有这4个属性。
id, name, groupid, userid
以下是扩展这4个属性的类型。
"Static": value
"Increment": currentValue, maxValue, overMaxAllowed, underNegativeAllowed
"Target": targetValue, result, lastResult
我最初尝试的是创建一个"记录"表中包含4个基本属性。然后我创建了另外3个名为" records_static / increment / target"的表,每个表都有其特定属性作为列。然后我在" rowID"之间建立了关系。每个辅助表中的列与主表" id"。
使用虚拟数据填充表格,我现在遇到一些尝试使用查询提取数据的主要问题。唯一的参数是userid,除此之外我需要的是一个包含与userid相关的所有列和数据的表。
我不确定是否应该放弃该表设计,或者我是否只是错误地查询了该查询。
我希望我解释得那么好,如果您需要更多细节,请告诉我。
答案 0 :(得分:1)
这是一个典型的面向对象的关系"映射问题。你可以找到有关这方面的书籍。还有很多谷歌点击
http://www.ibm.com/developerworks/library/ws-mapping-to-rdb/
最容易实现的是让一个表包含存储所有类型所需的所有列。确保将它们定义为可为空。如有必要,只有公共列不能为空。
答案 1 :(得分:1)
使设计尽可能简单。
首先,我尝试一个包含可能适用于记录的所有属性的表。不相关的属性可以是null
。您可以针对具有null
约束的特定类型强制执行check
值。
如果不能解决问题,您可以为每种记录类型创建三个表,而不使用公用表。
如果不起作用,您可以创建一个包含1:1扩展表的基表。请注意,查询更难,每次操作都需要join
:
select *
from fruit f
left join
apple a
on a.fruit_id = f.id
left join
pear p
on p.fruit_id = f.id
left join
...
设计越复杂,数据库状态不一致的空间就越大。第二个选项你可以有一个梨和一个具有相同ID的苹果。在第三个选项中,您可以在基表或扩展表中缺少行。或者表格可以相互矛盾,例如在Apple
表格中带有扩展行的“pear”基行。我完全信任最终用户找到一种方法将其纳入您的数据库:)
抛弃复杂的设计,从最简单的设计开始。您的第一次尝试并非失败:您现在知道在表之间添加关系的成本。在设计时,这看起来似乎是微不足道的(甚至是“正确的”)。
答案 2 :(得分:0)
仅仅因为对象共享一些相同的属性并不意味着你需要为两个对象都有一个表。这导致不必要的右外连接具有1对1的关系,这不是我认为的良好的数据库设计。
但是...
如果你想继续以你的方式继续我认为你需要的只是表中的主键,常用列“id,name,groupid,userid”(我假设ID)那么这将是你表的外键with currentValue,maxValue,overMaxAllowed,underNegativeAllowed