标签: schema

有效地存储具有截然不同的键的键值对集

我继承了一个应用程序,它将许多不同类型的活动与一个站点相关联。大约有 100 种不同的活动类型,每一种都有不同的 3-10 个字段集。但是,所有活动都至少有一个日期字段(可以是日期、开始日期、结束日期、预定开始日期等的任意组合)和一个负责人字段。所有其他字段差异很大,开始日期字段不一定称为“开始日期”。

为每个活动类型制作一个子类型表将导致一个包含 100 个不同子类型表的模式,这将过于笨拙而无法处理。该问题的当前解决方案是将活动值存储为键值对。这是当前系统的一个大大简化的架构,可以理解这一点。

在此处输入图片说明

每个Activity有多个ActivityFields;每个 Site 有多个 Activity,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>
  ...
Run Code Online (Sandbox Code Playgroud)

好处:

  • XSD 将验证 XML,捕获错误,例如在数据库级别将字符串放入数字字段中,这对于将所有内容存储在 varchar 中的旧模式来说是不可能的。
  • 用于构建 Web 表单的 KVP 记录集可以很容易地使用 select ... from ActivityXML.nodes('/SomeActivityType/*') as T(r)
  • XML 的 xpath 子查询可用于生成包含开始日期、结束日期等列的结果集,而不使用数据透视表,例如 select ActivityXML.value('.[@type=StartDate]', 'datetime') as StartDate, …

schema database-design sql-server-2012 reporting

9
推荐指数
1
解决办法
2646
查看次数

查找整数序列包含给定子序列的行

问题

注意:我指的是数学序列,而不是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)
);
Run Code Online (Sandbox Code Playgroud)

我的目标是使用给定的子序列查找行。也就是说,sequence字段是包含给定子序列的序列的行(在我的情况下,序列是有序的)。

例子

假设该表包含以下数据:

+----+-------+------------+-------------------------------+
| id | title |    date    |           sequence            |
+----+-------+------------+-------------------------------+
|  1 | BG703 | 2004-12-24 | {1,3,17,25,377,424,242,1234}  |
|  2 | BG256 | 2005-05-11 | {5,7,12,742,225,547,2142,223} |
|  3 | BD404 | 2004-10-13 | {3,4,12,5698,526}             |
| …
Run Code Online (Sandbox Code Playgroud)

schema postgresql performance array

9
推荐指数
1
解决办法
1357
查看次数

如何防止 SSDT 发布删除列

我想创建一个发布配置文件,它可以进行完整的架构比较和发布,但不会删除在新旧版本之间删除的任何表或任何列。

我知道设置中的阻止可能的数据丢失选项。AFAIK 这会停止发布过程,以防数据丢失。所以问题是,模式升级过程会被中断(在不知何故?)还是会完成但受影响的表将被排除在外?

如果表已添加和删除列,新列是否会添加到架构中,尽管由于潜在的数据丢失而阻止数据丢失选项会停止架构更新?

编辑 09.08.2016:

我想添加这些链接以补充有关背景的其他信息的问题:

schema sql-server deployment sql-server-2008-r2 ssdt

9
推荐指数
1
解决办法
1万
查看次数

数据库设计 - 具有共享标记的不同对象

我的背景更多是 Web 编程而不是数据库管理,所以如果我在这里使用了错误的术语,请纠正我。我正在尝试找出为我将要编写的应用程序设计数据库的最佳方法。

情况:我在一张表中有报告,在另一表中有建议。每个报告可以有许多建议。我还有一个单独的关键字表(用于实现标记)。但是,我只想让一组关键字同时应用于报告和建议,以便搜索关键字为您提供报告和建议作为结果。

这是我开始时的结构:

Reports
----------
ReportID
ReportName


Recommendations
----------
RecommendationID
RecommendationName
ReportID (foreign key)


Keywords
----------
KeywordID
KeywordName


ObjectKeywords
----------
KeywordID (foreign key)
ReportID (foreign key)
RecommendationID (foreign key)
Run Code Online (Sandbox Code Playgroud)

本能地,我觉得这不是最优的,我应该让我的可标记对象从一个共同的父级继承,并标记该注释父级,这将给出以下结构:

BaseObjects
----------
ObjectID (primary key)
ObjectType


Reports
----------
ObjectID_Report (foreign key)
ReportName


Recommendations
----------
ObjectID_Recommendation (foreign key)
RecommendationName
ObjectID_Report (foreign key)


Keywords
----------
KeywordID (primary key)
KeywordName


ObjectKeywords
----------
ObjectID (foreign key)
KeywordID (foreign key)
Run Code Online (Sandbox Code Playgroud)

我应该采用第二种结构吗?我在这里遗漏了任何重要的问题吗?另外,如果我选择第二个,我应该使用什么作为非通用名称来替换“对象”?

更新:

我在这个项目中使用 SQL Server。这是一个具有少量非并发用户的内部应用程序,因此我预计负载不会很高。在使用方面,关键字可能会很少使用。它几乎仅用于统计报告目的。从这个意义上说,无论我采用什么解决方案,都可能只会影响需要维护这个系统的任何开发人员……但我认为只要有可能就实施良好的实践是件好事。感谢所有的洞察力!

schema database-design best-practices

8
推荐指数
1
解决办法
2109
查看次数

如何仅从 .frm 文件中提取表架构?

我已经从备份中提取了 mysql 的数据目录,需要从旧表中获取模式,但它是来自另一台机器的备份。

我今天已经阅读了大量有关如何执行此操作的教程,但每次似乎都失败了,或者我最终不得不重新安装 mysql,因为 mysql 挂起或崩溃。我尝试了以下方法:

  • 创建不同的数据库
  • 在该数据库中创建同名表
  • 替换文件
  • 停止/启动引擎
  • .frm文件中恢复

我尝试了各种顺序和组合。

是否有任何外部工具可以从.frm文件中提取模式?如果我打开文件,我可以看到列名。我看了一眼,但似乎找不到任何能让我做到这一点的东西。

提前致谢。

mysql innodb schema recovery

8
推荐指数
1
解决办法
4万
查看次数

如何在 SQL Server 中批量迁移架构?

我们目前有多个数据库,但希望将它们组合起来,取而代之的是使用模式分离我们的域上下文。

在 MS SQL Server 2008 R2 中,如何将一个架构的所有内容批量重定位到另一个架构中?

例如,我们在dbo模式中创建的所有表、视图、过程、索引等……现在都将存在于foo模式中。

编辑:我想根据 AaronBertrand 的精彩评论进行澄清。这不是多租户情况。我们的情况是,内部工具插件是由开发人员单独开发的,他们没有将他们的表合并到工具的数据库中。

schema sql-server-2008-r2

8
推荐指数
1
解决办法
5373
查看次数

具有两种可能的所有者/父类型的实体的数据库架构?

我使用带有Sequelize 的PostgreSQL作为我的 ORM。

我有一种类型,User。第二种类型是Group,它可以通过一个GroupMemberships表将任意数量的用户与其关联。Users 也可以拥有任意数量的Groups。

我的第三种类型 ,Playlist可以属于 aUser或 a group。为这种类型设计模式以便它可以拥有一种类型的所有者或两者之一的最佳方法是什么?

我的第一遍创建了两个关联,但一次只填充一个。这可能有效,但看起来很笨拙并且使查询变得困难。

附加信息

以下是我对 MDCCL 通过评论发布的澄清请求的回应:

(1)如果一个播放列表是由给定资集团,可以说,这个播放列表是关系到一个一对多的用户,只要他们是会员这样的小组,对不对?

我相信这在技术上是正确的,但这种一对多关联并不明确存在。

(2) 那么,一个特定的播放列表是否有可能同时被一对多的群组拥有?

不, a 应该不可能被Playlist一对多拥有Groups

(3) 特定播放列表是否可能由一对多拥有,同时由不是该成员的一对多用户拥有?

不,因为如 (2) 中的一对多 from PlaylisttoGroup不应该存在。此外,如果 aPlaylist …

schema postgresql database-design subtypes

8
推荐指数
1
解决办法
1750
查看次数

功能依赖适用于整个数据库或特定关系?

我是 dbms 的新手。我看过一个关于函数依赖的讲座视频。但我有点困惑,函数依赖是对整个数据库还是特定模式的约束?

schema database-design dependencies

8
推荐指数
1
解决办法
243
查看次数

某酒店订房系统数据库设计

介绍和系统描述


我目前正在为酒店的客房预订系统设计一个数据库。

客户填写表格/请求,其中包含有关房间的以下信息:

  • 房间里的人数
  • 房间评分
  • 入住和退房日期

管理员有一个包含来自客户表格列表的仪表板,他将为每个客户手动分配每个房间。在此用户获得Bill 之后


数据库设计


这实际上是我的数据库的草图。我将有以下表格

  • 用户
  • 形式
  • 客房
  • 账单

我不考虑包含Password's Hashes 的Passwords

桌子设计


问题


我想听听您在我的数据库设计中缺少什么,您如何看待表之间关系的整体逻辑和正确性。

mysql schema foreign-key database-design

8
推荐指数
1
解决办法
6万
查看次数

将哪个数据模型/模式应用于具有不同字段的数据源的时间序列数据存储

我被要求为时间序列数据开发数据存储,尽管进行了大量研究,但我不确定要选择的数据模型和存储技术。

关于数据

要存储在数据存储器中的源数据由物理测量单元提供。每个单元可能有也可能没有不同的变量子集,每个测量站有多达 300 个变量(例如燃料类型、燃料消耗、速度),而所有站的不同信号数量约为 1500。预先知道每个站的预期变量子集。但是,随着时间的推移,可能会向站点添加额外的传感器(随着时间的推移,可能需要更改架构)。所有站都以从 20Hz 到 0.2Hz 的不同速率提供数据。

此外,还有相当数量的元数据可供所有这些测量站使用,最终我们将拥有大约 500 个。

数据通常是批量输入的,而不是“实时”流。批次大小从每小时批次到每月批次不等。

关于查询

进行数据查询主要有两个原因,单测站数据的上报和统计分析,以及跨站比较。大约 80% 的查询与过去 30 天内输入的数据有关。查询每天进行,因此SELECT负载超过INSERT负载。

理想情况下查询像

SELECT var1, var2, ... varN FROM station_data WHERE station_id=X OR station_id=Y AND TIMESTAMP BETWEEN ... AND ...;
Run Code Online (Sandbox Code Playgroud)

非 SQL 专家可以轻松访问数据。此外,简单的基于时间的聚合算法应该是可能的(AVG、MAX 等 pp)。

现在的情况

目前,使用高度规范化的结构将数据存储在 PostgreSQL 数据库中,该数据库现在增长到大约 6TB,每个变量一个表。大约 1500 个数据表中的每一个都是这样的形式

(timestamp, station_id, value)
Run Code Online (Sandbox Code Playgroud)

索引(station_id), (station_id, timestamp), (timestamp)和唯一约束(station_id, timestamp, value)

这种结构需要大量的外部连接(最多 300 个外部连接),这使得数据检索变得繁琐且计算成本高。

研究

到目前为止,进行了以下考虑:

数据库技术

  1. 虽然 NoSQL 将提供所需的架构灵活性,但确保数据完整性、访问控制和元数据管理的工具似乎具有挑战性,并且内部不存在 NoSQL 经验。此外,阅读与此相关的评论和答案似乎有利于我们用例的 …

schema postgresql database-design time-series-database timescaledb

8
推荐指数
1
解决办法
294
查看次数