Database design 用于在网页上存储URL的数据库表设计的最佳实践
直接问题: 设计用于存储页面上配置的URL的数据库表的最佳实践是什么 我们的用例: 我们进行了设计讨论,但无法得出正确设计的结论。我们 正在使用嵌入在表中的URL编写页面。所以页面看起来像Database design 用于在网页上存储URL的数据库表设计的最佳实践,database-design,presentation-layer,Database Design,Presentation Layer,直接问题: 设计用于存储页面上配置的URL的数据库表的最佳实践是什么 我们的用例: 我们进行了设计讨论,但无法得出正确设计的结论。我们 正在使用嵌入在表中的URL编写页面。所以页面看起来像 ....content(some text)... a |b |c |d text |url |url |url text |url |url |url text |url |url |url ....content(some text)...
....content(some text)...
a |b |c |d
text |url |url |url
text |url |url |url
text |url |url |url
....content(some text)...
其思想是在数据库中配置这些url,这样url更改就不需要在每次更改url时进行部署
编辑>a、b、c、d是表格标题。虽然a
部分下的内容将是普通文本,b、c、d
部分下的内容将是超链接
考虑到所有这些,表应该为这种结构设计什么。我们考虑了两种模式:
(a,b(url),c(url),d(url)) #dependent on table design. advantage: written code would
#be very simple and would not be dependent on the number
#of entries in the table.(a simple for loop would
#suffice for presentation logic). Disadvantage: if table
#changes in future, this table is doomed.
#EDIT>a,b,c,d are place holders to represent that content
#represent the headers of table.
(id, url) #advantage: Generic enough to encompass any url.
#disadvantage: This would require presentation layer changes in
#case of new addition of new row.
#EDIT>id is just a number to identify this url and would be used to
#refer while identifying this from presentation layer.
我们无法断定哪一个更好,因为每个人都有自己的权衡(直到我们错过了一些东西)。或者这些都不好
我们正在使用NoSql存储和Jsp来编写前端(表示)逻辑
编辑>表可能发生的更改类型如下:
添加新行(频繁)
删除现有行(频繁)
列的顺序可以更改(但很少)
列数更改(非常罕见,不认为曾经发生过,但可能发生)
更改基础URL(两种设计都支持,因此不重要)
这里主要关注的是维护开销(在表示和后端方面),这将由所考虑的任何一种设计引起
编辑2>
因此,这个项目只是为已经存在的服务编写前端。我们不需要处理太多所谓的应用程序状态。但在某个网页上有几个url(嵌入在我提到的表中),业务需求不是每次有人提出更改请求时都要部署(这段代码)(如更改最频繁的现有url)。因此,URL上的所有信息都将被移动到数据库中,并在页面加载时进行查询(或者可能是预加载,以便我们不会影响页面的性能)。现在讨论的是设计一个适合这种用途的表。TL;医生:
表示层表示应用层状态的一部分。独立于表示设计应用程序状态
预测变化
通过提供一个状态(数据库/api),将应用程序层的更改对表示层(或其他用户)的影响降至最低。这意味着()
例如,下面的API变得更加通用,但允许对列表进行更多的更改:“dog”、varchar(3)、varchar(n)、char列表、string。对应的代码可能是:print“dog”,对于i=1..3 print s[i],对于i=1..n print s[i],对于s.iterator()print s.next(),s.print()
更改越大,访问就越通用。所以,在可能性和变更规模与模糊性以及泛型计算成本之间找到一个工程平衡
应用层超越了表示层
考虑一个棋盘游戏。棋盘上有玩家、分数、回合、规则和位置,其中一些是玩家所在的位置等。但商店中的盒子可以有不同的图形、不同的实物材料、不同的代币、不同的文本格式、不同的语言;一些文本或图形不是翻译,而是类比;视频版本在灯光下有自己的呈现,用命令代替动作;一个联网的多人游戏版本同时有这样多个演示。将演示与游戏状态分开
首先,正确地为应用程序状态(“游戏”)设计一个数据库/api,独立于任何演示文稿(“盒子”)。将其体现在数据库管理系统中。然后,演示文稿查询/访问该状态/api。确定应用程序状态下的url文本与ID,具体假设与表示无关(将显示什么或将显示什么格式或何时显示)。(但您尚未对此回复我的评论。)大概在应用程序状态中存在表a-b-c-d,或者没有,但可以将其表示为其他表的查询。确定这些表格和任何其他明确假设与演示无关的表格。(但是你还没有回复我的评论。)这种设计应该隐藏当前应用层实际上是哪些预期的变体
然后编写表示层以查询/访问该应用程序状态
表示层的实现将有自己的状态。它可以将其中任何一个放在DBMS或任何其他资源中。(但是你还没有回复我的评论。)不要把应用程序对DBMS的使用和表示层对DBMS的使用混为一谈。DBMS只服务于两个主机。即使其层决定其状态,也会将应用程序表和表示表放在同一数据库中
…尽可能多
应用程序状态/api设计始终部分基于要进行的查询/访问以及体系结构。对于适当的应用程序,关系数据库可以将此最小化。在非关系实现中,设计将更受表示层的特定查询/访问的影响,但也受应用程序的所有用户的影响
答案
由于表示层的原因,尽可能不要在数据库中放置a-b-c-d或url ID或其他应用程序状态。独立于表示层设计应用层状态/api。这样你就可以详细回答你的问题了。(但您尚未对此回复。)我不明白您需要什么信息?你能具体说明你需要什么类型的信息吗?我会更