Sta*_*bie 7 mysql database database-design normalization
在Meetup.com中,当您加入聚会小组时,通常需要为该特定小组填写个人资料.例如,如果您加入电影聚会小组,则可能需要列出您喜欢的电影类型等.
我正在构建一个类似的应用程序,其中用户可以加入各个组并为每个组完成不同的配置文件详细信息.假设有两种可能性:
对这些数据建模的最佳方法是什么?
更详细的例子:
"电影观众"组要求其成员指定以下内容:
"极限运动"组要求其成员指定以下内容:
最重要的是,每个组可能需要加入其组的成员的不同细节.理想情况下,我希望任何人创建一个组(ala MeetUp.com).但是,我还需要能够很好地查询成员(例如,找到所有年龄在25到30岁之间的女性电影观众).
对于像这样的东西....你想要最大规范化,所以你不会在任何地方重复数据.因为您的用户定义的表可能包含相同类型的记录,所以我认为您可能必须超过3NF.
我的建议是这样 - 爆炸你的桌子,以便你有一些接近6NF的EAV,所以用户必须回答的每个问题都有自己的表格.然后,您的用户创建的表将引用您的一个问题表.这避免了重复数据问题.(例如,您不希望"MovieGoers"组中的条目名为"John Brown",而"极限运动"组中的条目名称为"Johnny B.",对于同一用户;您也不要我希望他的"你最喜欢的颜色"的答案是一组中的"蓝色"和另一组中的"红色".任何跨组的数据,如常见问题,都会以这种形式标准化.)
这样做的主要缺点是你最终会得到很多表,并且你可能想要为统计查询创建视图.但是,就纯数据完整性而言,这将很有效.
请注意,如果你真的想要,你可能只能将公共字段分解出去.常见字段的示例包括姓名,位置,性别等; 你也可以对常见的问题做同样的事情,比如"你最喜欢的颜色是什么"或"你有宠物"或者那种程度的东西.不跨组的特定于组的问题可以存储在该组的单独表中,未爆炸.我不建议这样做,因为它不像纯6NF选项那样灵活,你冒着重复的风险(你如何预先确定哪些问题不是常见的问题?)但如果你真的想要,你可以做这个.
这里有关于6NF的一个很好的问题:想用一个例子来理解6NF
我希望这是有道理的,我希望它有所帮助.如果您有任何疑问,请发表评论.
小智 6
实际上,这正是SQL不是正确解决方案的问题.忘记规范化.这正是NoSQL文档存储的工作.每个用户都是一个文档,有一些必要的字段,如id,name,pwd等.每个组都增加了添加一些字段的可能性.唯一字段可以具有名称group-id-prefixed,共享字段(掌握一些更一般的概念)可以使该字段名称免费.
除了用户(和组)之外,您将拥有包含名称,类型,可能值的字段描述......这对于文档存储也非常有用.
如果从一开始就使用键值文档存储,则可以获得构建数据的自由形式,并查询它们(尽管不是通过SQL,而是通过这个或那个NoSQL数据库提供的方式).
归档时间: |
|
查看次数: |
2608 次 |
最近记录: |