我继承了一个应用程序,它将许多不同类型的活动与一个站点相关联。大约有 100 种不同的活动类型,每一种都有不同的 3-10 个字段集。但是,所有活动都至少有一个日期字段(可以是日期、开始日期、结束日期、预定开始日期等的任意组合)和一个负责人字段。所有其他字段差异很大,开始日期字段不一定称为“开始日期”。
为每个活动类型制作一个子类型表将导致一个包含 100 个不同子类型表的模式,这将过于笨拙而无法处理。该问题的当前解决方案是将活动值存储为键值对。这是当前系统的一个大大简化的架构,可以理解这一点。

每个Activity有多个ActivityFields;每个 Site 有多个 Activity,SiteActivityData 表存储每个 SiteActivity 的 KVP。
这使得(基于 Web 的)应用程序非常容易编写代码,因为您真正需要做的就是遍历 SiteActivityData 中给定活动的记录,并为表单的每一行添加一个标签和输入控件。但是有很多问题:
所以我正在寻找一种方法来存储大量几乎没有共同字段的活动,从而使报告更容易。到目前为止,我想出的是使用 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)
好处:
select ... from ActivityXML.nodes('/SomeActivityType/*') as T(r)select ActivityXML.value('.[@type=StartDate]', 'datetime') as StartDate, …注意:我指的是数学序列,而不是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) 我想创建一个发布配置文件,它可以进行完整的架构比较和发布,但不会删除在新旧版本之间删除的任何表或任何列。
我知道设置中的阻止可能的数据丢失选项。AFAIK 这会停止发布过程,以防数据丢失。所以问题是,模式升级过程会被中断(在不知何故?)还是会完成但受影响的表将被排除在外?
如果表已添加和删除列,新列是否会添加到架构中,尽管由于潜在的数据丢失而阻止数据丢失选项会停止架构更新?
编辑 09.08.2016:
我想添加这些链接以补充有关背景的其他信息的问题:
我的背景更多是 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。这是一个具有少量非并发用户的内部应用程序,因此我预计负载不会很高。在使用方面,关键字可能会很少使用。它几乎仅用于统计报告目的。从这个意义上说,无论我采用什么解决方案,都可能只会影响需要维护这个系统的任何开发人员……但我认为只要有可能就实施良好的实践是件好事。感谢所有的洞察力!
我已经从备份中提取了 mysql 的数据目录,需要从旧表中获取模式,但它是来自另一台机器的备份。
我今天已经阅读了大量有关如何执行此操作的教程,但每次似乎都失败了,或者我最终不得不重新安装 mysql,因为 mysql 挂起或崩溃。我尝试了以下方法:
.frm文件中恢复我尝试了各种顺序和组合。
是否有任何外部工具可以从.frm文件中提取模式?如果我打开文件,我可以看到列名。我看了一眼,但似乎找不到任何能让我做到这一点的东西。
提前致谢。
我们目前有多个数据库,但希望将它们组合起来,取而代之的是使用模式分离我们的域上下文。
在 MS SQL Server 2008 R2 中,如何将一个架构的所有内容批量重定位到另一个架构中?
例如,我们在dbo模式中创建的所有表、视图、过程、索引等……现在都将存在于foo模式中。
编辑:我想根据 AaronBertrand 的精彩评论进行澄清。这不是多租户情况。我们的情况是,内部工具插件是由开发人员单独开发的,他们没有将他们的表合并到工具的数据库中。
我使用带有Sequelize 的PostgreSQL作为我的 ORM。
我有一种类型,User。第二种类型是Group,它可以通过一个GroupMemberships表将任意数量的用户与其关联。Users 也可以拥有任意数量的Groups。
我的第三种类型 ,Playlist可以属于 aUser或 a group。为这种类型设计模式以便它可以拥有一种类型的所有者或两者之一的最佳方法是什么?
我的第一遍创建了两个关联,但一次只填充一个。这可能有效,但看起来很笨拙并且使查询变得困难。
附加信息
以下是我对 MDCCL 通过评论发布的澄清请求的回应:
(1)如果一个播放列表是由给定资集团,可以说,这个播放列表是关系到一个一对多的用户,只要他们是会员这样的小组,对不对?
我相信这在技术上是正确的,但这种一对多关联并不明确存在。
(2) 那么,一个特定的播放列表是否有可能同时被一对多的群组拥有?
不, a 应该不可能被Playlist一对多拥有Groups。
(3) 特定播放列表是否可能由一对多组拥有,同时由不是该组成员的一对多用户拥有?
不,因为如 (2) 中的一对多 from PlaylisttoGroup不应该存在。此外,如果 aPlaylist …
我是 dbms 的新手。我看过一个关于函数依赖的讲座视频。但我有点困惑,函数依赖是对整个数据库还是特定模式的约束?
客户填写表格/请求,其中包含有关房间的以下信息:
管理员有一个包含来自客户的表格列表的仪表板,他将为每个客户手动分配每个房间。在此用户获得Bill 之后。
我不考虑包含Password's Hashes 的表Passwords。
我被要求为时间序列数据开发数据存储,尽管进行了大量研究,但我不确定要选择的数据模型和存储技术。
要存储在数据存储器中的源数据由物理测量单元提供。每个单元可能有也可能没有不同的变量子集,每个测量站有多达 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 个外部连接),这使得数据检索变得繁琐且计算成本高。
到目前为止,进行了以下考虑:
schema postgresql database-design time-series-database timescaledb
schema ×10
postgresql ×3
mysql ×2
array ×1
dependencies ×1
deployment ×1
foreign-key ×1
innodb ×1
performance ×1
recovery ×1
reporting ×1
sql-server ×1
ssdt ×1
subtypes ×1
timescaledb ×1