Questions tagged «schema»

数据库系统的模式是以数据库管理系统(DBMS)支持的正式语言描述的结构,是指数据的组织以创建如何构造数据库的蓝图(分为数据库表)。

5
PostgreSQL:表格的创建日期
我最近完成了一个项目,在此期间创建了许多数据库表。 这些表大多数包含临时垃圾,我正在寻找一种列出所有这些表的简单方法。 有没有一种方法可以列出根据创建日期排序的所有数据库表?

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授予该表,则错误消息会将表名更改为该视图读取的另一个表。

3
架构迁移:SQL Server数据工具与Liquibase和Flyway
这似乎是一个愚蠢的问题,但是我一直在研究用于架构迁移的开源解决方案,即Liquibase和Flyway。 但是,老板告诉我,SQL Server数据工具(SSDT)可以完成相同的工作。我不确定是否同意,但是我在互联网上几乎找不到直接将其与Liquibase和/或Flyway进行比较的东西。 我认为SSDT是SQL Server的开发,数据建模和设计工具,还支持架构比较(并生成其脚本)和源代码控制。它解决了一个不同的问题,尽管在模式迁移的某些方面可能与Liquibase / Flyway有所重叠。但是,作为整体架构迁移工具,Liquibase和Flyway是完全专用的工具,而SSDT则更多地用于数据库的设计和开发。 即使只是说没有可比性,SSDT本身也不是任何模式迁移工具,任何意见都会受到赞赏。
11 schema  ssdt  migration 

2
架构更改会“破坏”可用性组,还是透明处理?
我的组织计划采用SQL Server 2012可用性组,并且我试图了解它将对我们的应用程序升级过程产生什么影响(如果有)。 我们每8周发布一次应用程序更新,任何发布都可能包含架构更改和/或数据迁移。 我想了解的是HA / DR解决方案是否透明地处理架构更改(新列,索引添加到第二级),还是在每个实例上创建架构然后重新打开Always On所需的手动干预。 我假设的数据迁移部分是透明处理的,但也想确认一下。 我想我也在做出一个笼统的假设,即基于可用性组配置的这些行为也没有差异,这可能也是错误的。请告诉我。 简而言之; 在我的应用程序的任何给定发行版中,我都可以通过向表中添加列来更改非常大的表(10s至1亿亿条记录)。一些列可能是“ net new”的,因此它们可以利用企业在线模式更改功能。其他列可能是对现有列的重构(FullName被拆分为FirstName和LastName),并且将对表中的每一行运行迁移以填充这些字段。这些行为是否需要DBA更改AlwaysOn配置,或者默认情况下会进行处理,并且所有辅助节点都“免费”获得DDL和DML语句? 感谢您的澄清。

3
具有多个变体/属性的产品的架构设计?
我正在使用MySQL。这个想法类似于具有不同概念的shopify,因此用户将添加具有多种变体和属性类型的自己的产品。 从我所做的所有研究来看,这似乎是我最可能的解决方案,我只是想知道以下方案是否存在问题,还有哪些优点/缺点? 谢谢 Table: products ------------------------------ | ID | ProductName | |----------------------------| | 1 | Leather Wallet Case | | 2 | Jeans | | 3 | Power Bank | Table: products_variants ------------------------------- | ID | ProductId | ParentId | Variant | VariantName | SKU | StockTotal | WholeSalePrice | …

3
在PostgreSQL中为不能为null的字段不指定NOT NULL有什么后果?
我有一个应用程序(数据存储在PostgreSQL中),其中表中的大多数字段始终不为null,但是这些表的架构并未强制执行此操作。例如看这个假表: CREATE TABLE "tbl" ( "id" serial, "name" varchar(40), "num" int, "time" timestamp PRIMARY KEY ("id"), UNIQUE ("id") ); 此外name,num,time没有明确提及的NOT NULL,在现实中是这样,因为执行发生在应用端。 我的感觉是应该对其进行更改,但相反的是,应用程序级别确保此处不会出现空值,并且没有其他人手动修改该表。 我的问题是:通过设置显式NOT NULL约束? 我们拥有一个良好的代码审查流程和一个相当不错的文档,因此,某些新人提交的东西可能会破坏此约束,这实际上不足以证明更改是正确的。 这不是我的决定,所以这正是我在寻找其他理由的原因。我认为,如果某些内容不能为null,并且数据库允许您指定某些内容不为null,则只需执行此操作即可。特别是如果更改非常简单。

3
通常如何存储数据库中行的每次更改的记录?
在我正在从事的项目中,必须跟踪对数据库某些表中行的每次更改,以进行进一步的审核或回滚。必须很容易找到谁修改了该行,从哪个IP地址以及何时修改了该行,并且能够还原以前的版本。 例如,Stack Exchange使用了类似的方法。当我更改其他人的问题时,可能会发现我已更改了该问题,并回滚了所做的更改。 假设我当前的架构具有与普通业务应用程序大致相同的属性(下),那么用于将每个更改存储到数据库中的对象的通用技术是什么? 对象的大小相对较小:nvarchar(1000)例如,可能会有一些,但不是很大的二进制数据斑点,该斑点直接存储在磁盘上,并且可以直接访问,而不是通过Microsoft SQL访问filestream, 数据库负载非常低,整个数据库由服务器上的一个虚拟机处理, 对先前版本的访问不必与对最新版本的访问一样快,但仍必须是最新版本¹,而又不能太慢²。 <tl-dr> 我考虑过以下情况,但是我对这种情况没有真正的经验,所以我会听到其他人的意见: 将所有内容存储在同一张表中,按ID和版本区分行。国际海事组织,这是非常愚蠢的,并且迟早会影响性能。使用这种方法,也不可能为最新项目和版本跟踪设置不同的安全级别。最后,每个查询的编写都会更加复杂。实际上,要访问最新数据,我将被迫按ID将所有内容分组并在每个组中检索最新版本。 将最新版本存储在一个表中,并在每次更改时将过时的版本复制到另一个架构中的另一个表中。缺陷在于,即使价值不变,我们每次也会存储每个价值。将不变的值设置null为并不是解决方案,因为我还必须跟踪何时将值更改为null或更改为null。 将最新版本存储在一个表中,将已更改属性及其先前值的列表存储在另一表中。这似乎有两个缺陷:最重要的是,在同一列中对异构类型的先前值进行排序的唯一方法是使用binary(max)。第二个是,我认为,在向用户显示以前的版本时,使用这种结构会更加困难。 执行与前两点相同的操作,但是将版本存储在单独的数据库中。从性能角度来看,为了避免通过在同一数据库中保留以前的版本来减慢对最新版本的访问,可能会很有趣。仍然,我认为这是一个过早的优化,只有在有证据证明在同一数据库中拥有较旧和最新版本是瓶颈时,才必须进行此优化。 </ tl-dr> ¹例如,将更改存储到日志文件中(就像处理HTTP日志一样),并在服务器负载最低的晚上将数据从日志刷新到数据库中是不可接受的。有关不同版本的信息必须立即可用或几乎立即可用;几秒钟的延迟是可以接受的。 ²信息访问频率不是很高,只有特定的用户组才能访问,但是仍然不能强迫他们等待30秒才能显示版本列表。同样,延迟几秒钟是可以接受的。

2
我可以无损地分解这张桌子吗?
我偶然发现了一个数据库设计问题,而这个数据库设计问题超出了我的能力范围,而我的DBA专家也开始进行防火训练。 本质上,我有一个带有以下主键的表(为简洁起见,PK): child_id integer parent_id integer date datetime child_id并且parent_id是实体表的外键。“子”表本身还包含“父”表的外键,并且lo child_id始终引用与parent_id上表所期望的相同的外键。实际上,事实证明,还有一些额外的代码可以使两者保持同步。 这使这位热情洋溢的标准化新手说:“我应该删除冗余!” 我分解为以下内容: Table_1 PK: child_id integer date datetime Table_2 PK: parent_id integer date datetime Table_3: (already exists) child_id integer PRIMARY KEY parent_id integer FOREIGN KEY 而且,当我自然地将这些人加入一起时,我将恢复原始表。据我了解,制造出了5NF。 但是,现在我意识到存在隐藏的业务规则。 通常,与给定日期关联的日期child_id必须是与对应日期关联的日期的子集parent_id。您可以看到第一个表强制执行此规则。 我的分解不会强制执行该规则,因为您可以自由地将其添加到表1中,直到日期变得太大为止。 这将我引向以下问题: 这是5NF分解吗?虽然我说它允许插入异常,但它似乎也遵循Wiki示例,该示例本身遵循本指南。短语(强调我)“我们可以从由三种不同的记录类型组成的规范化形式中重构所有真实事实”,这给了我一个特殊的停顿,因为无论我注入多少垃圾Table_1,自然连接仍然会忽略它。 假设我不喜欢这种分解(我不喜欢)。我自由地承认,实际的解决方案是保留表和代码不变。但是,从理论上讲,是否有一种方法可以分解和/或添加约束,以使我摆脱第一个表并保留我的业务规则?

2
查找整数序列包含给定子序列的行
问题 注意:我指的是数学序列,而不是PostgreSQL的序列机制。 我有一张表,代表整数序列。定义是: CREATE TABLE sequences ( id serial NOT NULL, title character varying(255) NOT NULL, date date NOT NULL, sequence integer[] NOT NULL, CONSTRAINT "PRIM_KEY_SEQUENCES" PRIMARY KEY (id) ); 我的目标是使用给定的子序列查找行。也就是说,其中sequence字段是包含给定子序列的序列的行(在我的情况下,该序列是有序的)。 例 假设该表包含以下数据: +----+-------+------------+-------------------------------+ | id | title | date | sequence | +----+-------+------------+-------------------------------+ | 1 | BG703 | 2004-12-24 …

1
有效地存储键值对的集合,这些键值对具有完全不同的键
我继承了一个将许多不同类型的活动与站点相关联的应用程序。大约有100种不同的活动类型,每一种都有3-10个字段的不同集合。但是,所有活动至少都有一个日期字段(可以是日期,开始日期,结束日期,预定开始日期等的任意组合)和一个负责人字段。所有其他字段的差异很大,开始日期字段不一定称为“开始日期”。 为每种活动类型创建一个子类型表将导致具有100个不同子类型表的模式,这太麻烦了以至于无法处理。该问题的当前解决方案是将活动值存储为键值对。这是当前系统的一个大大简化的架构,可以用来说明要点。 每个活动都有多个ActivityField;每个站点都有多个活动,并且SiteActivityData表存储每个SiteActivity的KVP。 这使基于Web的应用程序非常容易编写代码,因为您真正需要做的就是遍历SiteActivityData中给定活动的记录,并为表单的每一行添加标签和输入控件。但是有很多问题: 诚信不好;可以在SiteActivityData中放置一个不属于活动类型的字段,而DataValue是一个varchar字段,因此需要不断地转换数字和日期。 报告和临时查询此数据非常困难,容易出错且速度很慢。例如,要获得某个结束日期在指定范围内的某种类型的所有活动的列表,则需要进行数据透视并将varchars转换为日期。报表编写者讨厌这种模式,我不怪他们。 因此,我要寻找的是一种存储大量几乎没有共同字段的活动的方式,从而可以简化报告。到目前为止,我想出的是使用XML以伪noSQL格式存储活动数据: Activity表将包含每个活动的XSD,从而无需使用ActivityField表。SiteActivity将包含键值XML,因此站点的每个活动现在都位于一行中。 一个活动看起来像这样(但是我还没有完全充实它): <SomeActivityType> <SomeDateField type="StartDate">2000-01-01</SomeDateField> <AnotherDateField type="EndDate">2011-01-01</AnotherDateField> <EmployeeId type="ResponsiblePerson">1234</EmployeeId> <SomeTextField>blah blah</SomeTextField> ... 优点: XSD将验证XML,捕获错误,例如在数据库级别将字符串放入数字字段中,这对于将所有内容都存储在varchar中的旧模式是无法实现的。 用于构建Web表单的KVP记录集可以很容易地使用 select ... from ActivityXML.nodes('/SomeActivityType/*') as T(r) XML的xpath子查询可用于生成一个包含开始日期,结束日期等列的结果集,而无需使用数据透视表,例如 select ActivityXML.value('.[@type=StartDate]', 'datetime') as StartDate, ActivityXML.value('.[@type=EndDate]', 'datetime') as EndDate from SiteActivity where... 这似乎是个好主意吗?我想不出其他方式来存储大量不同的属性集。我的另一个想法是保留现有模式,并将其转换为更容易在数据仓库中查询的内容,但是我以前从未设计过星型模式,也不知道从哪里开始。 附加问题:如果我使用定义XSD中具有日期数据类型的标记xs:date,SQL Server会将其索引为日期值吗?我担心如果我按日期查询,它将需要将日期字符串转换为日期值并浪费使用索引的任何机会。

1
设计用于需求预测分解的简单方案
我正在做一个简单的数据库设计任务,作为一个培训练习,在这种情况下,我必须针对以下情况提出基本的架构设计: 我具有产品的父子层次结构(例如,“原材料”>“在制品”>“最终产品”)。 在每个级别下订单。 在接下来的6个月内,应在每周的存储桶中查看订单数量。 可以针对每个产品级别进行需求预测。 未来6个月内任何一周的需求预测都可以在今天完成。 未来6个月将对每周的水桶进行需求预测。 需求预测通常在层次结构的较高级别(原始物料或在制品级别)进行,必须将其分解为较低级别(最终产品)。 有两种方法可以将需求预测从较高级别分解为较低级别: 用户指定最终产品的百分比分布。假设有一个正在进行的工作的1000的预测..用户说我要在存储区10中为最终产品1分配40%,为最终产品2分配60%。然后从现在开始第10周(星期日至星期六),预测值最终产品1的价格为400,最终产品2的价格为600。 用户说,只需根据针对第5个桶中的最终产品下达的订单进行分解,而第5个桶中第1个产品和第2个产品的订单分别为200和800,则EP1的预测值为((200/1000)* 100)%对于EP2,将是“进行中的工作”预测的((800/1000)* 100)%。 在接下来的6个月中,应可以按周的时段查看预测,理想的格式应为: product name | bucket number | week start date | week end date | forecast value | created_on PRODUCT_HIERARCHY表可能如下所示: id | name | parent_id __________________________________________ 1 | raw material | (null) 2 | work in progress …

2
存储XML数据的数据类型:VARCHAR(MAX)或XML
我正在使用SQL Server 2008为一组新资源定义一个架构...在这种情况下,每个记录(例如row)将需要存储XML片段。不时 尽管不经常 我将需要查询XML以查找元素和属性值。如果任由我自己设计,尽管倾向于让我相信这是有问题的,但我倾向于使用xml数据类型。这使我想到了我的问题。 在这种情况下,尝试决定将XML存储在xml列与varchar(MAX)列之间时,应该考虑哪些因素 如果有帮助,这里有一些其他详细信息: 对于这些片段(例如XSD的)使用架构的决定尚未决定 碎片的大小范围从小到很大 所有XML的格式都正确 在一天的过程中,需要大约3个月的时间,通过在线查询支持收集多达10,000个碎片 对XML的查询将全天进行,但是很少会出现这种类型的并发查询。

4
如何使用注释对PostgreSQL模式进行版本控制?
我使用Git控制大部分工作:代码,文档,系统配置。之所以能够做到这一点,是因为我所有有价值的工作都存储为文本文件。 我也一直在为Postgres数据库编写和处理许多SQL模式。该模式包括视图,SQL函数,我们将使用R编程语言(通过PL / R)编写Postgres函数。 我试图复制和删除我和我的协作者编写的块模式,但是我忘记这样做了。复制和过去操作是重复的,并且容易出错。 pg_dump / pg_restore方法将不起作用,因为它会丢失注释。 理想情况下,我希望有某种方法可以将当前模式提取到一个或多个文件中并保留注释,以便进行版本控制。 带有注释的版本控制架构的最佳实践是什么?

1
在PostgreSQL中使用许多模式而不是仅使用一种模式的利弊?
对于拥有30万个帐户(并且还在不断增长)的大型SAAS应用程序(由PostgreSql 9.4支持),每个帐户使用模式对数据进行分区与将所有数据置于一个模式中并使用外键进行数据交换的利弊是什么?在查询中将其分区? 我知道过去使用许多模式时pg_dump的速度很慢,但不确定今天是否是如此。我也知道数据库结构的任何更改都必须在所有模式上进行。而且我知道,从正面来看,将模式从一台物理服务器移动到另一台物理服务器很容易,并且可以从备份中还原模式,更不用说以这种方式分区数据了。 那么,我缺少哪些利弊?


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.