数据库管理员

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

2
概念性ERD多表多对多,还是可能递归?
我正在创建一个概念图[是的,我知道我已经包括了属性和键-但这只是为了巩固我在学习时正在做的事情] –因此,请把它视为概念图,重点放在关系和表而不是如何绘制;) 我的想法障碍是: 我正在尝试确定对个人档案,位置和组织关系进行建模的最佳方法。 首先,规则: 一个或多个个人资料可以是一个或多个组织的成员/朋友;反之亦然。 一个或多个个人资料可以是其他个人资料的成员/朋友。 一个或多个组织可以是其他组织的成员/朋友。 朋友和会员的不同之处在于,朋友就像只读的,而会员(取决于级别)具有完全的修改权限。 为了进一步使事情复杂化,场所具有自己的一组“更进一步”的可完善规则,例如,一个组织拥有两个场所,但是根据场所规则,该组织的成员[ 个人资料 ]可能在一个场所具有完全访问权限,但在该场所具有受限访问权限其他。[抱歉:您可能必须在另一个窗口中打开图像才能获得更好的查看尺寸。] 因此,正如您所看到的,“个人档案”和“组织”的概念几乎相同,而“ Friends and Members” [...]这个尚未建模的概念[...我想它将像设置Owner /的当前中介表一样处理记录中的管理员/成员/朋友等]。因此,为什么我要考虑以下概念: 请参见上图中的Option.2:它将删除当前的Organization和Organization_Locations表及其关系,将其替换为Option.2 Organization Table作为与Profile的某种递归关系。 我想问题的症结在于我是否在编程方面对多态性过于介意,以至于损害了其简单性和灵活性,使自己在整个过程中陷入混乱;) 谢谢您的提前考虑,非常感谢-M :)。 修改后的图: 针对MDCCL的问题: 是的,Profile是由一个Person组成的,并且具有相同的含义-尽管您的理论依据是-我相信您是正确的:Organization和Person可以是Profile的子类型;因此,概要由一个人或一个组织组成。 每个配置文件一个电子邮件地址。 是。如上所述,组织的至少应具有一个电子邮件地址。 正确,一个固定地址。 这是一种可能性,但是很罕见-尽管从我的经验中学到了-因此应该为将来的寿命等建模,并且为了确认,一个位置因此可以由多个人拥有。 位置绝对是大多数其他位置之间不可或缺的实体。也许我会在这里澄清一下可以做什么,然后让您阅读我的其他答案,希望这些答案可以先对该问题进行有益的补充[ 然后再查看我对#6的答案 ];)Re:角色所有者。 An **Organization** can be an Owner of zero or more **Locations**. A Person can be an …

1
用于快照一致性备份的存储快照-不同的数据和日志卷
我们正在vmware /共享存储环境中运行许多Linux VM,每个Linux VM都运行自己的postgreSQL实例(混合使用9.0和9.3)。当前,整个VM都位于单个根分区/卷上,使用基础VMFS卷的基于存储的快照进行备份/还原过程(以及复制到我们的DR站点),我们已经取得了巨大的成功(〜8年)。 由于我们的存储体系结构,将postgres WAL文件分离到一个非缓存的(主要是写入的)卷中会比较有利,这样可以减少我们在存储方面的缓存混乱。使用我们的存储(Nimble Storage),我们可以将两个卷都分配到一个保护/快照组,但是我无法从供应商处得出快照将在保护组中的所有卷上完全同时发生-可能会,但是总是有相隔毫秒的机会。 为此,我们进行了一些实验,所有实验都使用pg_bench尽可能快地将数据写入数据库。实验之后,我们恢复了快照的卷并启动了VM + postgres 快照数据和日志卷同时接近-结果:数据库已恢复 首先快照数据量,约1分钟后日志量-结果:数据库已恢复 首先是快照日志卷,之后是约1分钟的数据卷-结果:数据库已恢复 在WAL检查点将新数据写入数据文件之后,快照日志卷首先出现,数据量在大约3分钟后出现:结果:数据库已恢复 因此,测试似乎告诉我们,只要两个快照在卷级别上是一致的,并且相对紧密,就可以基于WAL / Log卷快照的时间获得数据库的一致副本。 我的问题:这样安全吗?我们在测试中缺少哪些极端情况?可能出什么问题? Postgres的文档表明这样做并不安全,但是测试似乎表明它非常健壮:http : //www.postgresql.org/docs/9.1/static/backup-file.html 如果您的数据库分布在多个文件系统中,则可能没有任何方法可以获取所有卷的完全同步的冻结快照。例如,如果数据文件和WAL日志位于不同的磁盘上,或者表空间位于不同的文件系统上,则由于快照必须同时进行,因此可能无法使用快照备份。在这种情况下,请务必仔细阅读文件系统文档,然后再使用一致快照技术。 注意:是的,我们知道其他确保其一致性的选项,例如将PostgreSQL置于热备份模式或使用我们存储的VMware集成来静默VM本身,但是我们正在寻找一种仅存储的解决方案以提高速度,便利性,对客户的影响为零。

2
如何在PL / pgSQL中获取手动引发的异常的异常上下文?
在Postgres中,我们使用以下代码获取异常的“堆栈跟踪”: EXCEPTION WHEN others THEN GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT; 对于“自然”异常,这很好用,但是如果我们使用 RAISE EXCEPTION 'This is an error!'; ...那么就没有堆栈跟踪。根据邮件列表条目,这可能是故意的,尽管我一生都无法弄清原因。这让我想找出引发异常的另一种方法,而不是使用RAISE。我只是想念一些明显的东西吗?有人对此有把戏吗?是否有我可以让Postgres抛出的异常,其中包含我选择的字符串,这样我不仅可以在错误消息中得到我的字符串,而且还可以得到完整的堆栈跟踪信息? 这是一个完整的示例: CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$ DECLARE v_error_stack text; BEGIN -- Comment this out to see how a "normal" exception will give you the stack trace RAISE …

3
验证现有用户的密码策略
我最近进入一种环境,其中许多数据库登录都未enforce_password_policy启用该标志。 即将进行的审核需要验证这些登录名的密码。 我使用以下查询来获取登录列表以及这些标志是打开还是关闭。 select @@SERVERNAME as servername, name, IS_SRVROLEMEMBER('sysadmin', name) as SYSADMIN, type_desc, create_date, is_policy_checked, is_disabled, password_hash, PWDCOMPARE(name, password_hash) as UsernameAsPassword FROM sys.sql_logins 但是,这并不能告诉我密码是否实际上遵守密码策略,因为该标志仅在创建用户时才相关。 有已知的方法来测试现有用户的密码策略遵从性吗? 我无法访问旧密码,因此我希望使用不需要它们的方法。

1
高PAGELATCH_ *和WRITELOG等待。他们有关系吗?
我们看到非常高的PAGELATCH_EX和PAGELATCH_SH等待类型以及较高的WRITELOG等待。我已经诊断出导致PAGELATCH等待的查询,并且可以通过降低插入由IDENTITY值定义的繁忙集群主键的插入率来消除它们。我知道这种现象被称为最后一页插入闩锁争用。 但是我的问题是,当插入新记录时,SQL Server是否在缓冲区页面上执行排他的PAGELATCH_EX,将记录​​插入缓冲区页面,将记录写入事务日志,然后释放排他的PAGELATCH_EX,详情如下:https:// www.microsoft.com/zh-cn/download/details.aspx?id=26665第24页。还是先将记录写到事务日志中,然后再进行PAGELATCH_EX的详细说明,“解决高度并发的PAGELATCH争用-插入工作负载-背景信息SQLCAT的指南:关系引擎 如果将记录写到锁存机制之外的日志中,那么我可以排除对磁盘的慢速写入,这是导致PAGELATCH等待时间较长的原因。但是,如果保持闩锁直到记录难以记录,那么我应该考虑WRITELOG。 同样,具有多个非聚集索引会导致PAGELATCH_ *锁存器保持更长的时间,即,如果表具有聚簇且多个非聚簇索引被同时添加并释放到每个索引缓冲区页的锁存器? 更新1 阅读confio-sql-server-writelog-wait幻灯片2和一般的WAL体系结构之后。现在,我的理解是,两本白皮书中详细介绍的“记录行已被修改的日志条目”步骤是指SQL Server在事务日志缓存(而不是磁盘)中记录更改。一旦事务完成或缓冲区已满,所有记录将立即刷新到磁盘。

1
这个颠倒的银钥匙图标是什么
我继承了一个SQL Server 2005第三方服务器和数据库,以能够生成报告和仪表板。 在一张桌子上,我找到了一个新图标:蓝银色的上下颠倒钥匙,以及其他主钥匙和外钥匙。 当我右键单击它时,上下文菜单为我提供了“脚本约束为”选项,但是当我尝试对其进行“修改”时,它将打开列设计表单(如主键),但是它出现在“索引”部分,而不是约束。 有人知道它的名字以及它的用途吗?

2
存储IP地址-varchar(45)与varbinary(16)
我要创建一个表有两个领域- ID作为BIGINT和IPAddress作为两种varchar(45)或varbinary(16)。想法是存储所有唯一的IP地址,并使用引用ID代替IP address其他表中的实际IP 。 通常,我将创建一个存储过程,该存储过程返回ID给定的IP address或(如果未找到地址)插入地址并返回生成的ID。 我期望有很多记录(我无法确切知道有多少条记录),但是我需要上面的存储过程尽快执行。因此,我想知道如何以文本或字节格式存储实际的IP地址。哪个会更好? 我已经编写SQL CLR了将IP地址字节转换为字符串和反向的函数,因此转换不是问题(使用IPv4和都可以IPv6)。 我想我需要创建一个索引来优化搜索,但是我不确定是否应该将该IP address字段包括在聚集索引中,还是要创建一个单独的索引,并且使用哪种类型的搜索会更快?

2
INSERT INTO新创建的目标表后,ROLLBACK不起作用
我正在研究将CSV文件(customers.csv)导入MySQL表(customers)的PHP脚本。 在将CSV文件的内容插入mysql表之前,我首先备份原始customers表。 我将整个导入过程(包括备份)包装在mysql事务中(以解决CSV在中间某处损坏的情况,并确保导入是原子的)。 问题是,当我在INSERT INTO语句后立即调用它时,ROLLBACK似乎不起作用:通过phpMyAdmin检查数据库时,我可以看到新创建的表,并且roollback之后仍存在ROWS INSIDE IT。 这是操作日志: [2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] [] [2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] [] [2015-01-19 14:08:28] DEBUG: CREATE TABLE `customers__20150119_14_08_20` LIKE `customers` [] [] [2015-01-19 14:08:37] DEBUG: INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers` [] [] [2015-01-19 14:08:50] DEBUG: "ROLLBACK" …

1
将查询计划按语句拆分以提高可重用性会更好吗?
从我对查询计划如何通过查询进行编译,存储和检索的有限知识中,我了解到多语句查询或存储过程将生成其查询计划,该查询计划将存储在查询计划缓存中,以供查询在将来的执行中使用。 我认为此计划是使用查询哈希从查询计划缓存中检索的,这意味着如果编辑并执行查询,哈希将有所不同,并且会生成新计划,因为在查询计划缓存中找不到匹配的哈希。 我的问题是:如果用户执行多语句查询中的语句之一的语句,是否可以将缓存中已存在的查询计划的相关部分用于多语句查询?我希望答案是否定的,因为哈希值显然不匹配,但是对多语句查询中的每个语句进行哈希处理会更好些,以便用户在查询中运行单个语句可以使用它们吗? 我希望有一些我没有考虑到的复杂因素(而这正是我真正想知道的),但似乎我们可以在许多查询计划中存储相同的“语句计划”,从而占用更多空间并占用更多时间CPU和生成时间。 可能只是显示我的无知。

3
SQL Server:在视图中而不是在其表中授予对用户的选择访问权限
我有一个带有几个数据库的SQL Server 2012实例。在其中一个视图中,我创建了一个视图,该视图在多个数据库中选择表。 我希望用户能够选择该视图,但是它不能选择其表。正是由于用户无法选择表而创建了视图。 我已阅读/programming/368414/grant-select-on-a-view-not-base-table和http://msdn.microsoft.com/zh-cn/library/ms188676。 aspx仍然无法正常工作。 如果我GRANT SELECT TABLE TO USER对所有表都执行操作,则用户可以选择视图。但是,如果我撤消到任何表,它将失败。 这应该是一个简单的过程,但是我很难使它起作用。我曾经见过它发生过(实例的所有者为我提供了访问视图的权限,但未在其表中进行操作),但我无法做到这一点或找不到某个知道怎么做的人。 有人可以给我提供有关如何做的教程或代码示例吗? 当用户SELECTs查看我的消息时: 对对象<TABLE>,数据库<DB>,模式的SELECT权限被拒绝dbo。 如果我将select授予该表,则错误消息会将表名更改为该视图读取的另一个表。

2
了解统计信息,执行计划和“升序关键问题”
我试图更好地(从概念上)理解统计信息,执行计划,存储过程执行之间的关系。 我是否正确地说统计仅在为存储过程创建执行计划时使用,而没有在实际执行上下文中使用?换句话说,如果这是真的,那么一旦创建了计划(并假设其已正确使用),“最新”统计数据的重要性如何? 我读过的一篇文章(《统计》,《行估计》和《升序的日期》栏)使我特别受启发,该文章描述了一种非常类似于我每天都使用客户数据库的情况。 在我们使用特定存储过程定期查询的最大表之一中,我们有一个升序的日期/时间列。 当每天增加十万行时,如何防止执行计划变得过时? 如果我们经常更新统计信息以解决此问题,那么在此存储过程的查询中使用OPTION(RECOMPILE)提示是否有意义? 任何意见或建议,将不胜感激。 更新:我正在使用SQL Server 2012(SP1)。

3
电子邮件地址是唯一键还是主键?
我是数据库的新手。我四处阅读,发现使用电子邮件地址作为主键可能不是一个好主意,因为字符串比较慢,这会影响复杂连接中的性能;如果电子邮件发生更改,我必须更改所有外键,这需要很多工作努力。 但是,如果我的用户表要求每个用户都有一个电子邮件地址,并且每个电子邮件地址都应该是唯一的,那么在电子邮件列上添加唯一索引就足够了吗?因为afaik唯一字段允许空值,而我要求每个用户都有一个电子邮件地址,但不允许空值。我在这里想念什么吗?或者我想使电子邮件列唯一,并确保在服务器上的数据验证期间用户确实输入了电子邮件地址,以便每个用户都有一个电子邮件地址?


2
查找每个连续系列行的总持续时间
MySQL版本 该代码将在MySQL 5.5中运行 背景 我有一张像下面的桌子 CREATE TABLE t ( id INT NOT NULL AUTO_INCREMENT , patient_id INT NOT NULL , bed_id INT NOT NULL , ward_id INT NOT NULL , admitted DATETIME NOT NULL , discharged DATETIME , PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 该表与医院中的患者有关,并且存储每个患者住院时花时间的床铺。 每个病房可能有多个病床,每个病人可能会移到同一病房内的另一个病床。 目的 我想做的是找出每个患者花了多少时间在一个特定的病房而又没有转移到另一个病房。即,我想找到他在同一病房中度过的连续时间的总持续时间。 …


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.