6

这个问题是参考我的previous question。根据我的要求,我对数据库做了一些修改,但是我不确定如何创建子菜单(需要从其他表创建,而不是主表pg_Pages表。我的问题是我可以很容易地为“关于我们”和“多媒体”创建子菜单,因为我将这些页面存储在pg_Pages表中,但是我需要为News创建子菜单从News Category表和它们magazine表链接到正确的页面处理程序。&问题。网站数据库设计(CMS)数据库驱动菜单的考虑和建议

菜单例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创建静态链接和触发查询。

News Menu基本上显示文章的类别,进一步我需要一个查询,它只会显示News菜单中的类别,该菜单包含针对该特定问题的文章。假设如果问题102没有任何与文化相关的文章那么文化子菜单不应该显示在新闻下。

+0

我不会试图在一个数据模型来模拟一个 “菜单”。你唯一能做的就是显示菜单。如果你只是序列化菜单对象(例如使用json.net)并存储它们,你会让生活变得更容易。 –

+0

@Filip,你的意思是我应该创建一个单独的'菜单'表,字段类似于MenuID,MenuName,PageID等等。如果我错了,请给我一个例子 – Learning

+1

我会在你的web应用程序中创建一个文件menu.json并在那里转储整个结构。 –

回答

3

您的任务是将您的站点实例映射到菜单实例。这可以通过View轻松完成。

因此,例如,创建viewMenu有以下栏目:MenuItemIdMenuItemNameMenuItemLevelMenuItemParentMenuItemUrl。您可以操纵这些属性以在您的代码中创建菜单。您也可以使用SQL查询创建初始视图来处理当前数据库结构或任何未来结构中的数据。

至于现在,您可能会将三个不同查询的结果联合到您的三个表中。将来你可以添加功能到你的菜单改变视图。将新表添加到数据库时,还可以将新项目添加到菜单中。

4

对于通用CMS应该有一个单独的菜单表和一个相关的MenuItems表。

可以有各种不同的菜单 - 顶部/主菜单内左侧的菜单网站页脚等等......你应该在菜单表中定义它们。

应该比你有一个递归的MenuItems表,可以有子菜单项无限多。

菜单表至少应该有这些列:

  • 菜单ID(INT)
  • 说明(为nvarchar(...))
  • CREATEDATE,CreatedBy,ModifyDate .... - 记录列...

的MenuItems表应该至少有这些列:

  • MenuItemID(int)
  • MenuID(int) - 与哪个菜单有关???
  • 标题(为nvarchar(...))
  • LanguageID(int或其他)
  • ParentMenuItemID(INT)递归
  • 链接(为nvarchar(...)),不管它是链接到(页面,外部网站,没有,...)。在结束一切都归结为一个链接...
  • IsExternalLink(通常是外部链接,您可能会禁用另一个选项卡上的搜索引擎优化抓取和开放 - 所以知道这会是个不错)
  • SortOrder的(INT)排序
  • CREATEDATE,CreatedBy,ModifyDate .... - 记录列...

希望它可以帮助...