Questions tagged «relational-database»

关系数据库是基于数据关系模型的数字数据库。此模型将数据组织到一个或多个列和行的表(或“关系”)中

7
代理密钥是否应该向用户公开?
通常,在没有自然键的表中,对于用户来说,拥有唯一生成的标识符仍然很有用。如果表具有代理主键(在这种情况下,您一定会希望它具有),该键应该向用户公开还是应将另一个字段用于该目的? 不公开代理键的原因之一是,现在您不能执行保留记录之间关系的操作,而只能更改键值,例如某些类型的删除/重新插入,将数据从一个数据库复制到数据库的许多方法。另一个等等 公开代理键的主要优点是使用您拥有的字段非常简单。 在什么情况下最好直接向用户公开代理密钥?

7
为什么SQL被称为基于关系/功能的语言?
我们了解到,大多数语言都被分类为“基于关系的”或“高级”这两种语言。我以前从未使用过SQL,但是通过阅读其语法,它似乎更像是命令式/高级语法,而不是基于函数/关系的(Lisp,Haskell)? 或者可能是我对我的教授的讲义的解释是错误的...但是它确实将SQL列为基于关系的语言之一(与高级语言相对),并且将基于关系的语言等同于功能性的语言...或者也许是我不明白为什么SQL处理关系数据库这一事实使函数语言成为应实现的方式?(为什么在对编程语言进行分类时,“基于关系的”等同于“功能的”?) 谢谢 :)

2
带有额外列的单个表与具有重复模式的多个表
我正在一个项目上,在某个时候,我需要决定是否要在数据库中的单个表中包含不是每个记录都使用的多列,或者是多个表具有重复的模式。 我正在创建一个体育信息应用程序,它可以处理多种体育运动。例如,我们可以处理NBA,NHL,MLB,NFL。每种运动都有非常相似的概念-球队,日程表,伤害,球员信息。 当然,我们的数据源并不能为我们提供同一模式中的每条数据。每个运动都有一个不同的架构,我们从供应商那里接收数据。 因为没有足够的时间(客户需求)对数据源进行前期分析以确定共同点,所以我对冲了自己的赌注并进行了“安全下注”,为每种运动制作了单独的表格,而不是一组单独的表格体育使用。 结果是在多个表中复制了架构,因此也复制了数据库的接口(例如存储的proc)。我有一些类似NBA_Game,NFL_Game,NBA_Team,NFL_Team等的东西。每个表可能有一些其他人没有的属性,并且有几个是共享的。在4项或5项运动中,连续进行5-10桌。我仍然不确定这是否完全是一件坏事-另一种选择是,拥有一组表,表上具有并非所有运动项目都会使用的属性,它本身也可能很笨拙。 有谁做过这种设计的陷阱,可以在这里分享他们的经验吗?也许可以帮助我现在知道的事情,而不是刻苦学习的东西?您是否以另一种方式完成了工作,即拥有一个大表/一组表,并且使用了并非每条记录都会使用的列?您遇到了什么陷阱? 过去是否使用过一些替代方法,例如表继承,效果更好? 谢谢

4
这些特定的表是否需要代理键?
背景 我有这张桌子 +-------------------------+ +------------------------+ |Airport | |Country | |-------------------------| |------------------------| |airport_code string (PK) | |country_code string (PK)| |address string | |name string | |name string | +------------------------+ +-------------------------+ +-------------------------+ |Currency | |-------------------------| |currency_code string (PK)| |name string | +-------------------------+ airport_code是IATA(国际航空运输协会)的 机场代码,乘飞机旅行时,您可以在行李标签中看到它们。 country_code是ISO 3166-1 A3标准国家/地区代码,您可以在奥运会上查看它们。 currency_code是IS0 417标准的3个字符的货币代码,您可以在国际货币兑换显示板上看到它们。 问题 这些自然PK是否足够好? 是否使用世界公认的标准,而整个行业都接受了PK的标准? 这张桌子是否需要代孕品?


5
我的团队害怕带有外键关系的关系数据库实体,我不明白为什么
我刚从大学毕业,所以对关系数据库的熟悉程度大部分来自于我的数据库课程,在该课程中,BCNF或3NF以外的任何事物都是荒唐的。当然,这是极端的目的,但是我的工作团队似乎确实将其推向了另一端。 在我们的微服务数据库架构中,实体很少有多个表。您通常会标准化到另一个表的所有内容都存储在json列中。如果以后发现需要查询此json中的属性之一,则会添加一个新列,并将数据存储在两个位置(是的,在同一表的两个不同列中)。 在许多情况下,这些json列绝对具有优势。如果您不需要查询数据,也不必单方面更改数据(这显然是您无法预测的),那么这不是一个坏主意。再加上我们的许多服务都看不到服务器,或者托管在具有淫秽磁盘空间的计算机上,无法满足他们的需求,因此数据复制不是一个大问题。(尽管我通常会出于哲学目的避免这种情况) 当前,我们正在构建一个服务,该服务根据规则所拥有的一组条件匹配规则,然后在规则为真(例如,所有条件都为真)时执行与这些规则关联的一组操作。我的最直接构建此服务的小组认为,从架构规则中规范动作和条件有很大的好处。显然,这些表与规则ID保持外键关系。从我们的角度来看,我们可以避免条件上的数据重复,这使我们能够确保仅对它们进行一次评估,并且在需要它们时很容易找到我们需要的条件和规则,而无需提取每个规则并在内存中进行搜索。 今天,他与我们的一位首席工程师交谈,试图使我远离这种模式。试图以各种方式争辩我们实际上并不需要它,这将在将来引起性能问题,并引用了我们拥有的旧单片,这是设计上的麻烦。他将我们正在做的事情称为“旧方法”,将带有json的平面表称为“新方法”。他争辩说,在我想要原子性的地方,我们不需要它,而不是查询,我们应该在内存中做更多的事情。这是我们许多服务现在遵循的设计原则。我们预计数据量不会大幅增长,这将使我们的查询保持快速。我们确实期望在规则评估和执行操作上花费大量时间。 我知道非关系数据库近年来已经变得越来越流行,但是即使在积极地搜索有关外键关系对性能的影响的信息时,我也看不到很多信息可以证明他的观点。我想他们可能会倾向于引入可能导致问题的大型事务,但这似乎是一个独立于外键本身的问题。 这是我的天真吗?还是我和我的子团队确实缺少某些东西?我没有明确提供有关我们问题的详细信息,因为我不一定正在寻找解决方案。考虑到这是我们大型团队的共同趋势,我真的很好奇他们是否对此有所帮助。


4
如何在关系数据库中表示枚举类型?
我正在开发一个关系数据库,该数据库跟踪我正在为公司工作的设备上发生的交易。设备上可能发生不同类型的事务,因此我们的一个主记录表中有一个“ trans_type”字段。我的小组决定将该字段的类型设置为整数,并将其视为枚举类型。我的直觉告诉我,将这个字段设置为字符串是一个更好的主意,以便我们的数据库数据更具可读性和可用性。我的同事们似乎担心这会造成更多的麻烦,而不是值得的。字符串比较的成本太高,而且错别字的可能性太大。 因此,您认为,当处理关系数据库中的字段本质上是枚举值时,将该字段设为整数或字符串是否是更好的设计决策?还是我忽略了其他选择? 注意:我们使用的数据库不支持显式枚举类型。我们正在开发的将与此数据库连接的软件是用C ++编写的。

2
处理订阅,余额和定价计划更改
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 序言 我的目的是为多个项目创建可重用的代码(并在github上发布)以管理订阅。我了解条带化和定期计费提供商,但这不是该模块的目标。它应该只是用于计算帐户余额,轻松通知续订订阅以及处理价格计算的包装程序/帮助程序。 在某些国家/地区,您可能无法使用重复计费,因为提供商或付款方式对此支持不佳或没有支持,或者价格太高(小额付款)。而且有些人不想使用循环计费,而是手动支付账单/在年末开具发票。因此,请不要建议贝宝定期计费,递归或类似服务。 情况 假设您有一个可以订阅订阅计划的模型(例如User)。该模型具有一个字段,该字段存储当前正在订阅的订阅计划的标识符。因此,在每次计划更改时,都会记录更改。 有一个模型(例如SubscriptionPlanChanges),其中的以下字段记录了提到的更改: subscriber与订阅模型有关(User在这种情况下) from_plan 定义更改之前模型具有的计划标识符 to_plan 定义模型现在选择的计划标识符 created_at 是存储更改的日期时间字段 valid_until 存储日期,直到实际订阅有效 paid_at 也是一个日期时间字段,用于定义是否(以及何时)订阅已支付 当然,这种布局是可以讨论的。 帐户余额问题 当用户更改其订阅计划时,我需要比较计划字段,获取价格,并根据当前计划valid_until及其价格计算新计划的扣除额。说:您订购了计划A的一年,但是在6个月后,您升级到计划B,因此您可以从计划A的6个月中扣除一半的已付价格。 我想知道的是:如果某个用户(例如)切换到免费计划,那么他有一个积分,如果该用户想要再次切换,则可以扣除该积分。您会在另一个字段中缓存该值,还是每次都计算与该用户相关的所有记录?您会添加/更改有关表格布局的内容吗? 易于理解的问题 当订阅期结束时,用户会收到通知,并有可能通过再次付费来续订其订阅。最简单的方法是只更新paid_at和valid_until新的订阅选项。但是,我不确定您是否存储了某人可能需要的所有数据,例如付款/订阅历史记录。 另一个选择是为此创建一个附加记录,其中from_plan和to_plan具有相同的标识符(因此表示“无变化”)。但是这不会以某种方式干扰帐户余额的计算吗? 如果有人能为我指出有关处理此类订阅的逻辑的正确方向,我将非常感激。 更新 感谢您的帮助。我认为我的问题太模糊了,因此我将尝试通过使用较少的抽象来使其更加精确。不幸的是,我还不能解决我的问题。 案例A User可以选择Subscription Plan A。当前,此文件存储了一个SubscriptionPlanChange以进行跟踪。例如5个月后,User将其订阅升级为Subscription Plan B。因此,他为新订阅支付价格,减去未使用的7个月的方案a的价格。 案例B 3个月后,User回滚到他的Subscription Plan A。他不必付款,但会收到一笔余额,因此,在订阅结束时,他将从新订阅中扣除该余额。 案例C User可以为具有独立订阅计划的子服务选择订阅计划。相同Case A,Case B可以申请该子服务订阅。 _Case D_ 用户取消其订阅之一。这导致他的余额增加了。 我的问题(目前至少是)主要取决于如何正确存储数据,以便我可以重现订阅的历史以进行业务分析和计算余额,并根据订阅获得未付款项等。 我也不确定是否应将余额存储在例如用户模型本身中,或者是否未存储但可以根据存储的数据/历史记录随时进行计算。 需要注意一些事项,尽管我认为它们不应该引入问题: …

10
RDBMS如何被视为一种时尚?
我于2003年完成了计算机A级学习,并于2007年获得了计算机学位,并且在一家使用大量SQL的公司中学习了自己的交易,因此我想到了将关系数据库用于存储的想法。 因此,尽管相对较不熟悉开发,我还是吃了一惊(在/software//q/89994/12436上)读到的评论说: [一些开发人员]鄙视[SQL],并认为它和RDBMS是一时的流行 显然,有能力的开发人员将使用正确的工具来完成正确的工作,并且在例如适用于平面文件或其他存储解决方案的情况下,不会创建关系数据库,但是RDBM在很多情况下都非常有用,因此如何被认为是一种时尚?

2
B树与R树相比-是不是一堆链接在一起的链表?
我对B树非常熟悉,主要是必须使数据库充满电力,空调和硬盘空间。我与一个双(doubl [ie,ey]?)链接列表相关联。 今天,午餐时的一位开发人员提到了R树。 我跳上维基百科,开始阅读。这听起来像高大的B树。不幸的是,由于缺乏深厚的数学背景,很难理解我的一些同事在谈论什么。 我希望有人能阐明B树和R树之间的一些区别。无论如何,我可能最终都会问这些家伙,但是不能保证他们会回答我的问题。他们很有可能会开始对上帝God不休,知道什么。。。

1
关系代数/演算证明可以用于测试/验证SQL吗?
使用证明形式的关系代数和/或关系演算来测试/验证SQL语句,函数和存储过程的正确性,是否可行甚至可能? 在我看来,至少应该有这种可能,但是我不知道是否缺少细节,使证明与代码之间的1:1映射不正确。 你们有没有尝试过这样的方法?奏效了吗?您的经历如何?

2
关系数据库回归测试中的数据质量
我一直在研究开源的博物馆收藏管理Web应用程序,该应用程序将用于跟踪博物馆的加入,捐赠,借出或以其他方式获得的文物。 这涉及到设计和创建一个相当大的数据库(相对于我以前的经验),该数据库存储各种变化的信息(艺术品信息,更改的位置信息,个人联系信息,图片等),这些信息需要灵活且易于扩展。 我刚刚完成我的大学学位,并且我不是数据库设计方面的专业人士,所以我真的很想创建一个全面的测试套件,以确保我拥有的一切都可以正常使用。 我已阅读了有关数据库测试的内容,并遇到了几篇有关数据库的回归测试的文章,但我不完全了解这一切。通过阅读Dobbs博士的这篇文章,我了解到,我需要做的一种测试是验证数据库中的逻辑是否正确。因此,我将创建将某些数据插入数据库的测试,然后通过查询进行跟踪以确保我从数据库中获取了正确的数据(确保所有适当的触发器或视图都在工作)。 提到测试“数据质量”会引起混乱。在上面的文章中,作者提到您想通过测试验证以下内容: 列域值规则 列默认值规则 价值存在规则 行值规则 尺寸规则 这将涉及哪些类型的测试以及如何实施?这也是我第一次编写数据库测试套件,是否有关于如何/从何开始的良好指导,或者可以遵循的指导测试开发的任何流程?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.