网站(CMS)考虑的数据库设计&建议数据库驱动的菜单

时间:2012-10-17 06:07:36

标签: asp.net sql-server database-design data-structures content-management-system

这个问题与我的previous question有关。根据我的要求,我对数据库进行了一些修正,但我仍然不确定如何创建子菜单(需要从另一个表而不是主pg_Pages表创建。

我将页面信息保存在pg_Pages我可以创建菜单的位置。我的问题是,我可以轻松地为“关于我们”和“多媒体”创建子菜单,因为我将这些页面存储在pg_Pages表中,但我需要从News创建子菜单。 News Category表并将它们链接到正确的页面处理程序。 &安培;问题来自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创建静态链接和触发查询。

News Menu基本上显示了文章的类别。此外,我需要一个查询,该查询仅显示News菜单下的类别,其中包含针对该特定问题的文章。假设问题102没有任何与 文化 相关的文章,那么文化子菜单不应该出现在新闻中。

2 个答案:

答案 0 :(得分:4)

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

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

你应该有一个递归的 MenuItems 表,它可以有无数个子菜单项

菜单表至少应包含以下列:

  • MenuID(int)
  • 描述(nvarchar(...))
  • CreateDate,CreatedBy,ModifyDate .... - 记录列...

MenuItems表至少应包含以下列:

  • MenuItemID(int)
  • MenuID(int) - 与哪个菜单???
  • 相关
  • Caption(nvarchar(...))
  • LanguageID(int或其他)
  • ParentMenuItemID(int)用于递归
  • 链接(nvarchar(...))无论链接到什么(页面,外部网站,没有,...)。最后,一切都必须归结为一个链接......
  • IsExternalLink(通常用于外部链接,您可以禁用S.E.O.抓取并在另一个标签页上打开 - 所以知道这可能是好的)
  • SortOrder(int)订购
  • CreateDate,CreatedBy,ModifyDate .... - 记录列...

希望它有所帮助...

答案 1 :(得分:3)

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

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

就目前而言,您可以将三个不同查询的结果合并到三个表中。将来,您可以在菜单更改视图中添加功能。在向数据库添加新表时,还可以在菜单中添加新项目。