网站数据库设计(CMS)考虑因素和基于数据库的菜单建议

8
这个问题是关于我之前的问题的参考。根据我的要求,我已经对数据库进行了一些更正,但我仍然不确定如何创建子菜单(需要从另一个表而不是主pg_Pages表中创建)。
我将页面信息保存在pg_Pages中,从那里可以创建我的菜单。我的问题是,我可以轻松地为“关于我们”和“多媒体”创建子菜单,因为我将那些页面存储在pg_Pages表中,但我需要从新闻分类表中创建News的子菜单,并将它们链接到适当的页面处理程序和magazine表中的问题。 菜单示例 enter image description here 样本数据
pg_Pages Table
PageID  PageName    LangID  PagePositionNo  PageURL     PageInheritance
1   Home        1   10      Default.aspx    0
2   About Us    1   20      Page.aspx   0
3   PageOne     1   10      Page.aspx   2
4   PageTwo     1   20      Page.aspx   2
5   Multimedia  1   30      Page.aspx   0
6   Video       1   10      Videos.aspx 5
7   PhotoGallery    1   20      Gallery.aspx    5
8   News        1   40      News.aspx   0
9   Issues      1   50      #       0
10  Publication 1   60      Page.aspx   0
11  SpanishHome 2   10      Default.aspx    0
12  SpanisAbout Us  2   20      Page.aspx   0
------------------------------------------------------------------------------
Magazine
MagazineID  MagazineIssueCode   LangID  MagazineTitle   MagazineLiveIssue(CurrentIssue)
1       101         1   Mag Title       0
2       102         1   Mag Title       1
3       101         2   SpanisgMag Title    0
4       102         2   Mag Title       1
------------------------------------------------------------------------------

art_Article Table
ArticleID   ArticleTitle    ArticleCatID    MagazineID  Language   TYPE 
1       Article one 100     1       1   Artile
2       Article two 100     1       1   Artile
3       Article three   200     1       1   Artile
4       Article four    300     1       1   Artile
5       Article Five    100     2       1   Artile
6       EditorMessage   300     2       1   EditorMessage
7       Article seven   200     2       2   Somthing
------------------------------------------------------------------------------

我希望我的设计足够灵活,可以从不同的表格中读取菜单。为了正确地完成这个任务,我需要采取哪种方法/更改,而不是为所有菜单创建单独的表格并将它们链接到页面?请为这种情况提供最佳方法。
我希望系统非常灵活,并直接从数据库中读取菜单信息,而不是创建静态链接并根据IssueID或其他ID触发查询。
“新闻菜单”基本上显示文章的类别,此外,我需要一个查询,只显示与该特定问题相关的“新闻”菜单下的类别。假设问题102没有与“文化”相关的任何文章,则在新闻下不应显示文化子菜单。

1
我不会尝试在数据模型中建模“菜单”。您将使用该信息的唯一方式是显示菜单。如果您只是序列化菜单对象(例如使用json.net)并存储它们,那么您的生活将变得更加轻松。 - Filip De Vos
1
我会在您的Web应用程序中创建一个名为menu.json的文件,并将整个结构转储到其中。 - Filip De Vos
我会查看Liferay的数据库架构以获取“灵感”。 - Neil McGuigan
1
你可以使用杂志和文章表中的页面ID字段作为页面表的外键。在获取菜单时链接这些表。 - MahaSwetha
1
你可以在表中再添加一个名为“Active”的字段,将该字段的值设置为1以激活菜单,当该菜单不需要时将其设置为0。将这两个想法结合起来并尝试一下。 - MahaSwetha
显示剩余3条评论
2个回答

4
对于一个通用的CMS,应该有单独的菜单表和相关的菜单项表。
可以有不同类型的菜单 - 顶部/主菜单、内部左侧菜单、站点页脚等...你应该在菜单表中定义它们。
然后你应该有一个递归的菜单项表,它可以有无限数量的子菜单项。
菜单表至少应该有以下列:
- MenuID (int) - Description (nvarchar(...)) - CreateDate, CreatedBy, ModifyDate.... - 日志列...
菜单项表至少应该有以下列:
- MenuItemID (int) - MenuID (int) - 相关的菜单是哪个? - Caption (nvarchar(...)) - LanguageID (int或其他) - ParentMenuItemID (int) 用于递归 - Link (nvarchar(...)) 链接到什么(页面、外部站点、无...)。最终所有内容都必须归结为链接... - IsExternalLink (通常对于外部链接,您可能会禁用S.E.O.爬行并在另一个选项卡中打开 - 因此了解它可能很好) - SortOrder (int) 排序 - CreateDate, CreatedBy, ModifyDate.... - 日志列...
希望对您有所帮助...

3
您的任务是将站点实例映射到菜单实例上。这可以通过View轻松完成。
例如,创建viewMenu并设置以下列:MenuItemIdMenuItemNameMenuItemLevelMenuItemParentMenuItemUrl。您可以通过操作这些属性来在代码中创建菜单。还可以使用SQL查询来操作当前数据库结构或任何未来的结构中的数据,并创建初始视图。
现在,您可以将三个不同查询的结果合并到三个表中。将来,您可以添加功能来更改视图中的菜单。同时,在向数据库添加新表时,还可以向菜单添加新项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接