【发布时间】:2010-12-02 17:37:55
【问题描述】:
我为这件事的冗长、胡言乱语道歉,但我凌晨 3 点起床,害怕明天必须去工作并处理这个数据库……感觉不对,但也许我错了,就像事情一样按我的方式完成...请告诉我你的想法。
我们的数据库架构类似于:
page: id, label, contentid, parentpageid
content: id, xmldata
我们在页表中有大约 4000 个条目...
我已经包含了一个大大简化的页面层次结构,类似于本文底部的代码列表。
问题的根源在于数据库充满了这样的事情:
- 对于每个带有“标签”的“页面” SET(有 3 个)有 16 个 儿童,每个都标有 SECTION 数字。
- 每个单独的 SECTION 都有一个 名为“关于”的孩子和 名为“信息”的孩子
- 每个“关于”页面都有一组 标签为:“关于事物”、“关于事物”的孩子 和“关于其他事情”
请注意,虽然孩子们的标签相同,但他们可能会有不同(但相似)的内容。
考虑到数据,我对这个架构有一些主要问题,我想知道我是否有道理,是否有一个好的解决方案或我应该阅读的内容。
主要问题是:有很多重复的条目和重复的层次结构。
edit:另一个问题是,如果一个页面有子页面,它的 contentid 会被忽略。浪费空间?
我也很难弄清楚我在树中的什么位置……我在看什么类型的对象?
例如,TASK 节点的显示方式需要与其他节点不同......并且确定节点是否为任务的唯一方法是,它的父级标签是否为“Tasks”(或“Jobs”或“去做”)。我尝试使用节点的“深度”,但这不起作用,因为有时其他项目需要在同一深度上进行不同的显示。
提出的解决方案是添加“类型”字段...然后 UI 决定如何显示节点(例如“导航”节点进入主选项卡栏(例如关于)和任务类型节点侧边栏中的下拉菜单),但同样感觉也不对。
此外,目前还没有对项目进行排序的方法。到目前为止,我们很幸运,数据以他们想要显示的正确顺序进入数据库,到目前为止还没有删除。
他们想添加一个“排序顺序”字段来解决这个问题。设置似乎需要很多手动工作,特别是如果他们想要重新排序特定的菜单集......(例如,在每个 About 节点中插入一个新子节点),虽然我想可以编写一个简单的脚本来做到这一点...虽然我的论点是我应该能够在一个位置更改它,然后它就完成了。
我从未见过这样设置的数据库,但他们声称,这就是所有数据库的设置方式。这就是他们的目的。我是疯了还是这是一种荒谬的方式来设置具有如此多重复层次结构的任何数据库(还要记住,下面的层次结构比真实的页面层次结构具有更少的重复条目和重复树)。
老实说,我想提出一个更好的解决方案,但我不确定那是什么,因为在真正的层次结构中有 8 种不同类型的“关于”样式节点,其中一些包含更多节点和更多子节点...但是孩子们的标签和顺序总是相同的模式。我是否需要为每种类型的页面创建一个表格?
我注意到这似乎也是网站的一个常见问题,他们可能有一堆页面,所有页面都有完全相同的一组孩子......但没有办法说:好的,我想要这个页面继承这组孩子,但我希望他们都有不同的内容。现在我想将孩子重新排列在一个位置并让它们全部更新。有没有一种稳健、简单的方法来解决这个问题?
SET1
SECTION1
-About
-About Things
-About Stuff
-About Other Stuff
-Info
-Tasks
-A
-B
-C
...
-H
-Data
SECTION2
-About
-About Things
-About Stuff
-About Other Stuff
-Info
-Tasks
-A
-B
-C
...
-H
-Data
...
SECTION16
SET2
SECTION1
-About
-About Things
-About Stuff
-About Other Stuff
-Info
-Jobs
-1
-2
-3
...
-8
-ToDo
-A
-B
-C
...
-H
-Other Data
SECTION2
-About
-About Things
-About Stuff
-About Other Stuff
-Info
-Jobs
-1
-2
-3
...
-8
-ToDo
-A
-B
-C
...
-H
-Other Data
SET3 (Exact same setup as SET2)
...
谢谢!
【问题讨论】:
标签: sql mysql database-design schema data-modeling