数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

1
默认情况下,我可以从SQL Server获取哪些事件信息?
我经常在人们想知道某件事是否发生,何时发生或由谁执行操作的问题上遇到疑问。在很多情况下,SQL Server不会单独跟踪此信息。例如: 谁最后执行存储过程dbo.MyProcedure? 谁更新salary了dbo.Employees表格中的列? 谁最后dbo.Orders从Management Studio 查询表格? 但是默认情况下,SQL Server 会临时跟踪其他一些事件,这些事件可以本地回答有关的问题,例如: 上一次在AdventureWorks数据库中发生自动增长是什么时候? 谁删除了dbo.EmployeeAuditData表格,何时删除? 今天发生了多少与内存相关的错误? 我如何获得此信息,以及该信息可以使用多长时间?

3
使用UUID或GUID作为主键有什么缺点?
我想建立一个分布式系统。我需要将数据存储在数据库中,使用UUID或GUID作为某些表上的主键会很有帮助。由于UUID / GUID很大,而且几乎是随机的,因此我认为这种设计有缺点。替代方法是使用自动递增的INT或LONG。 使用UUID或GUID作为表的主键有什么缺点? 我可能将Derby / JavaDB(在客户端上)和PostgreSQL(在服务器上)用作DBMS。


5
写入varchar和nvarchar之间的差异
当前在SQL Server 2012数据库中,我们正在使用varchar,并且我们想要更改它nvarchar。我已经生成了一个脚本来做到这一点。 我的问题是,SQL Server在写入varchar列与写入列方面有什么区别nvarchar?我们有许多我关心的后端程序。 编辑: 不确定是否有帮助,但是列没有索引,f / k或约束。



6
关于单线程与多线程数据库的性能
H2是在性能方面享有良好声誉的单线程数据库。其他数据库是多线程的。 我的问题是:多线程数据库什么时候比单线程数据库更有趣?有多少用户?多少个过程?触发因素是什么?任何人都可以分享经验吗? 摘要 通常的瓶颈是磁盘访问 SSD速度快,但易碎(必须执行故障处理程序) 在单线程系统上执行一个长查询将阻止所有其他查询 配置多线程系统可能很棘手 即使在单核系统上,多线程数据库也很有用

3
查找层次结构字段的最高级别:带有CTE或不带有CTE
注意:此问题已更新,以反映出我们当前正在使用MySQL,这样做之后,我想知道如果切换到支持CTE的数据库会容易得多。 我有一个带有主键id和外键的自引用表parent_id。 +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | parent_id | int(11) | YES | | NULL | | | name | varchar(255) | YES | | NULL …


5
如何选择每个组的第一行?
我有一张这样的桌子: ID | Val | Kind ---------------------- 1 | 1337 | 2 2 | 1337 | 1 3 | 3 | 4 4 | 3 | 4 我想制作一个SELECT将仅返回第一行的Val命令,按排序Kind。 样本输出: ID | Val | Kind ---------------------- 2 | 1337 | 1 3 | 3 | 4 如何建立这个查询?

9
您应该在编写应用程序代码之前设计数据库吗?
设计数据库的最简单,最有效的方法是什么?在我看来,应用程序的数据存储设计有两个选项: 在编写任何应用程序代码之前,请尽可能最好地设计数据库。这为您提供了可以使用的基本数据结构的优点。我认为,这样做的缺点是您将进行很多更改,因为应用程序的具体细节会影响整个应用程序开发周期中数据的更改内容/位置/方式。 随着应用程序的实现,设计数据库。当您在编写应用程序时需要一些数据库对象时,可以与应用程序并行(按时间顺序)开发数据库。我所看到的好处是减少了对数据库结构的更改。缺点是应用程序代码和数据库开发之间的时间和开发工作的划分。 根据您的经验,您发现什么是最有效和高效的方法?

7
编写一个简单的银行架构:如何使我的余额与他们的交易记录保持同步?
我正在为一个简单的银行数据库编写模式。基本规格如下: 数据库将针对用户和货币存储交易。 每个用户每种货币都有一个余额,因此每个余额只是针对给定用户和货币的所有交易的总和。 余额不能为负。 银行应用程序将专门通过存储过程与其数据库进行通信。 我希望该数据库每天可以接受成千上万的新交易,并且可以平衡更高数量级的查询。要非常快地用完余额,我需要预先对其进行汇总。同时,我需要保证余额永远不会与其交易历史相矛盾。 我的选择是: 有一个单独的balances表,然后执行下列操作之一: 将交易应用到transactions和balances表。TRANSACTION在存储过程层中使用逻辑,以确保余额和交易始终保持同步。(由Jack支持。) 将交易应用到transactions表格,并使用触发器balances为我更新交易金额。 将事务应用于balances表,并具有一个触发器,该触发器transactions为我在表中添加一个具有事务量的新条目。 我必须依靠基于安全性的方法来确保在存储过程之外无法进行任何更改。否则,例如,某些过程可能会直接将事务插入transactions表中,而根据计划1.3,相关余额将不同步。 有一个balances索引视图可以适当地汇总事务。存储引擎保证余额与事务保持同步,因此我不需要依靠基于安全性的方法来保证这一点。另一方面,由于视图-甚至是索引视图-都没有CHECK约束,因此我不能再将余额强制为非负数。(由Denny支持。) 仅具有一个transactions表,但具有一个附加列来存储该交易执行后立即生效的余额。因此,用户和货币的最新交易记录也包含其当前余额。(下面由安德鲁建议;由garik提出。) 当我第一次解决这个问题时,我阅读了这 两个讨论并决定选择2。作为参考,您可以在此处看到其基本实现。 您是否设计或管理了这样的具有高负载配置文件的数据库?您如何解决此问题? 您认为我做出了正确的设计选择吗?我有什么要记住的吗? 例如,我知道对transactions表的架构更改将需要我重建balances视图。即使我在归档事务以保持数据库较小(例如,通过将它们移动到其他地方并用汇总事务替换),每次架构更新都必须从数千万个事务中重建视图,这可能意味着每个部署的停机时间会大大增加。 如果要使用索引视图,如何保证没有余额是负数? 归档交易: 让我详细说明一下归档事务和上面提到的“摘要事务”。首先,在这样的高负载系统中,定期归档将是必要的。我想保持余额与交易记录之间的一致性,同时允许将旧交易移至其他位置。为此,我将使用每位用户和货币金额的摘要替换每一批已归档的交易。 因此,例如,以下交易清单: user_id currency_id amount is_summary ------------------------------------------------ 3 1 10.60 0 3 1 -55.00 0 3 1 -12.12 0 已归档并替换为: user_id currency_id amount is_summary ------------------------------------------------ 3 1 -56.52 1 …




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.