Questions tagged «database-design»

数据库的概念模式和/或逻辑模型和/或物理设置的开发。

2
重新设计数据库的机会:用于此传感器数据收集的表格设计如何?
背景 我有一个大约2000个传感器的网络,每个传感器都有大约100个数据点,我们每隔10分钟收集一次。这些数据点通常是int值,但有些是字符串和浮点数。此数据应存储90天,如果可能的话,还可以保留更长时间。 数据库设计 当最初负责该项目时,我编写了一个C#应用程序,该程序为每个传感器编写了逗号分隔的文件。当时没有那么多,当有人想查看趋势时,我们将在Excel中打开csv并根据需要绘制图形。 事情发展了,我们切换到了MySQL数据库。我为每个传感器创建了一个表格(是的,我知道很多表格!);它一直运行良好,但是有一些局限性。拥有如此多的表,显然不可能编写查询来查找特定值时在所有传感器中查找数据的查询。 对于下一个版本,我切换到Microsoft SQL Server Express,并将所有传感器数据放入一个大表中。这也有效,并且让我们进行查询以在所有感兴趣的传感器中查找值。但是,我遇到了Express版本的10GB限制,因此决定改回MySQL,而不是投资于SQL Server Standard。 问题 我对MySQL的性能和可伸缩性感到满意,但不确定是否坚持采用“一个表中的所有数据”方法是最好的。一张桌子上的10GB似乎要求使用其他设计。我应该提到仍然需要查询图形数据,而且我担心查询图形时会出现性能问题,例如,整个90天中一个传感器的温度数据。(换句话说,图形应该是可以快速生成的图形,而不必等待SQL对大量数据进行排序以隔离感兴趣的传感器。) 是否应该以某种方式拆分此表以提高性能?拥有这么大的桌子不是很平常吗? 我在Sensor ID和Timestamp列上都有索引,这几乎是任何查询的定义边界。(即从时间A到时间B获取传感器X的数据)。 我已经阅读了一些有关分片和分区的知识,但是在这种情况下,觉得不合适。 编辑: 根据到目前为止的评论和答案,一些其他信息可能会有所帮助: 不定期存储:目前,我不存储90天以上的数据。每天,我都会运行一个查询,以删除90天以上的数据。如果将来它变得很重要,我会存储更多,但现在就足够了。这有助于保持大小和性能更高。 引擎类型:原始的MySQL实现使用MyISAM。这次为新实现创建表时(一个数据表而不是多个数据表),它们默认为InnoDB。我不认为我需要其中之一。 标准化:当然,除了数据收集表外,还有其他表。这些支持表存储诸如传感器的网络信息,用户的登录信息等内容。据我所知,没有太多要标准化的东西。数据表具有如此多列的原因是每个传感器都有很多变量。(多个温度,光照水平,气压等)。对我进行归一化意味着没有冗余数据或重复的组。(至少对于1NF。)对于给定的传感器,在特定时间存储所有值需要一行数据,并且其中不涉及1:N关系(我知道)。 我可以在功能上分解表,例如在一个表中创建所有与温度相关的值,在另一个表中创建与气压相关的所有值。虽然这可能会提高仅进行温度查询的人员的效率,但我仍然必须一次插入所有数据。尽管如此,效率提高对于SELECT操作还是值得的。显然,最好根据用户请求数据的频率垂直拆分表。也许这就是我应该做的。我想在问我一个问题时正在寻求确认,这样做是值得的。 编辑2: 数据使用:最终,绝不会查看或需要很多数据,因为我们通常只关注有问题的项目。但是,在尝试发现问题时,我们使用各种工具来搜索数据并确定要放大的项目。 例如,我们注意到内存使用率值(特定于客户的专有软件程序)与重启/崩溃之间的相关性。我收集的数据点之一与此内存使用情况有关,并且我能够查看历史数据以显示超出特定内存使用量后设备变得不稳定。今天,对于运行该软件的部分设备,我检查了该值,如果该值过高,则发出重新启动命令。在发现这一点之前,我认为收集这些数据没有价值。 因此,我坚持要收集并存储大约100个数据点,即使该值值得怀疑。但是在正常的日常使用中,用户通常会检查其中的十几个参数。如果用户对特定地理区域感兴趣,则他(可以使用软件)可能会为几十个传感器生成数据的图形或电子表格。查看30天的图表并显示两条或三条显示温度,气压和光照水平等曲线的情况并不少见。这样做将运行类似于以下的查询: SELECT sensor_id, location, data_timestamp, temp1, air1, light1 FROM data WHERE data_timestamp >= '2012-02-01' AND sensor_id IN (1, 2, 3); (在原始的MySQL版本中,每个传感器都有自己的表,将发出三个单独的查询,但结果将通过软件合并以创建图形。) 由于该data表包含很多行(〜1000万),尽管在id和上都有索引data_timestamp,所以性能明显比多表方案(9秒内返回4500行,而在此示例中不到1秒)要好。在多表模式中,找到哪些传感器满足特定条件的能力实际上为零,因此,移至单个表的原因。 这类查询可以由多个用户快速连续地完成,因为他们选择了不同的数据组并比较每个结果中的图形。每个图形或电子表格等待近10秒可能会令人沮丧。 90天后数据将被丢弃。可以将其存档,但当前不是必需的。 …

4
使用同义词避免创建重复表是一个好主意吗?
我们有3个完全相同的数据库副本。所有3个数据库都有一个Users表,并且一个用户将始终在所有3个数据库中使用完全相同的设置。每当我们要添加或编辑用户时,我们都必须更新3个数据库。 Users从数据库2和3中删除该表并将其替换为Synonym指向数据库1的a 是一个更好的主意吗? 这是我能想到的优点/缺点: 优点 易于维护。可以在一个位置而不是3个位置更新用户 用户ID将在数据库之间匹配(这一点很重要,因为很多附加应用程序都基于UserId) 缺点 不要以为这是标准程序,所以可能会造成混淆 用户在数据库之间必须具有相同的设置 (从下面的gbn回答)如果数据库1曾经出现故障,则数据库2和3也将不可用。还存在潜在的问题,即在还原事件中数据不一致 这是我正在考虑的一个选项,用于几个不同的表,这些表包含数据库之间相同的设置,而不仅仅是Users表。我在示例中使用Users是因为它很容易理解。

3
设计比赛数据库的最佳方法
我正在创建一个网页,用于在即将到来的2012年欧洲杯足球锦标赛的所有比赛中下注。需要一些帮助来确定淘汰赛阶段应采取的方法。 我在下面创建了一个样机,当存储所有“已知”小组赛比赛的结果时,我非常满意。这种设计使检查用户是否正确下注变得非常容易。 但是,存储四分之一决赛和半决赛的最佳方法是什么?这些比赛取决于小组赛的结果。 我想到的一种方法是将所有比赛添加到matches表中,但是在淘汰赛阶段将不同的变量或标识符分配给主队/客队。然后将其他标识符映射到团队的其他表中……这可能有用,但感觉不正确。

4
PostgreSQL设计工具
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 5年前关闭。 我将要设计一个要与PostgreSQL一起运行的数据库。我习惯了用于MySQL数据库的称为MySQL Workbench的宏伟工具。它很有用,而且看起来不错,这是我希望从数据库设计软件获得的。 如果我要学习一种新的数据库设计工具,那么我希望它成为最受欢迎的工具。因此,我的问题是:在PostgreSQL中设计数据库最流行的工具是什么?

2
在Oracle中进行PL / SQL工作的应用程序开发人员的安全性
您如何处理Oracle中缺少架构级别特权的问题?Oracle的安全体系结构适用于只需要对象级特权的应用程序,并且适用于几乎不需要限制的DBA。但是,对于使用前端应用程序和多种模式的PL / SQL进行开发的程序员而言,体系结构中似乎存在很大的漏洞。这是我的一些缺点: 使每个程序员都按照自己的模式进行开发。DBA将向需要它们的程序员授予对象级别的特权。任何软件包开发都必须由DBA完成。主要缺点是程序员会像使用存储桶一样使用数据库,从而损害数据库性能。我希望程序员在数据库中进行开发,但是这种方法会大大不利于它。 为每个程序员提供他们需要进行开发的十几种模式的用户名/密码。向这些应用程序模式授予创建过程,表等的权限。这种方法的一些缺点是程序员必须维护多个登录名,并且必须很少自己登录。跨模式开发也很困难。 向程序员授予开发所需的每个模式的代理身份验证特权。这使他们可以自己登录,而不必授予他们代理权限以外的其他权限。缺点包括程序员必须为其代理的每个模式维护独立的连接,跨模式开发更加麻烦,因为连接必须不断更改,并且使用带有已通过身份验证的公共数据库链接的程序包无法在代理连接内部进行编译。 给每个程序员DBA特权。–这里的缺点是安全性。不能将任何模式程序员挡在任何模式之外,并且任何程序员都可以模仿任何其他程序员(DBA)。 似乎缺少一个选项来授予每个程序员SELECT / INSERT / CREATE / etc。他们需要在其中进行开发的模式具有特权。他们使用一个连接以自己的身份登录以完成工作。他们有权访问的架构中的新对象将立即可用。 我想念什么吗?您如何处理进行PL / SQL开发的应用程序程序员?

2
如何构建模型以正确,有效地表示关系数据库中的树状数据?
基于使用SQL问题在关系数据库中遍历树状数据的方法,我想知道如何在考虑物理影响的情况下定期用于在关系数据库中描述树状数据的方式? 我假设RDBMS除了常规的SQL ANSI或常用功能之外,没有其他特殊功能来处理这些功能。 毫无疑问,我一直对MySQL和PostgreSQL以及最终对SQLite感兴趣。

1
未使用的NONCLUSTERED INDEX仍然可以提高查询速度吗?
这是一种奇怪的情况,但我希望有人能回答。 在进行一些性能问题排查期间,我们按照的要求将NONCLUSTERED INDEX添加到了表中sp_BlitzIndex。第二天,我们检查了它的使用情况,结果显示0次读取(0次扫描/搜索,0次单例查找),因此我们将其禁用。 在第二分钟,我们收到了抱怨应用程序缓慢(性能问题)的投诉,这是我们在添加INDEX时首先尝试检查并解决的问题。 现在,从理论上讲,这听起来纯属巧合。可证明,可衡量的是,未使用 INDEX 。禁用它不会导致查询性能下降。但它几乎TOO巧合。 题 因此,我的问题就很简单了: 它是在所有可能的,一个非聚集索引,其使用提供的统计(从动态管理视图/ sp_BlitzIndex)显示NO使用,还是已经帮助受影响的表以某种方式查询性能?

6
举例说明2NF与3NF
我对第二范式(2NF)有疑问,但无法使用Google来解决。这让我发疯,因为我是一名老师,而且我不想向学生们教错误的东西。 让我们有一个包含5个字段的表格。 评分= {学生姓名,学科编号,学科名称,#考试,年级} 依赖性是这样的: 学生姓名,科目代码,#考试->年级 SubjectCode-> SubjectName SubjectName-> SubjectCode 因此,候选键1是{StudentName,SubjectCode,#Exam},候选键2是{StudentName,SubjectName,#Exam}。 主要属性是{StudentName,SubjectCode,SubjectName,#Exam},非主要属性是Grade 根据第二范式的定义,非素数属性不能取决于候选密钥的一部分。唯一的非素数属性(Grade)不依赖于候选键的一部分,因此该表看起来像2NF。 问题是我认为有些不对(我可能错了)。我认为受试者应该有自己的桌子。 评分= {学生姓名,学科代码,#考试,年级} 主题= {主题代码,主题名称} 但是2NF不会产生这种情况。3NF与非素数属性之间的依赖关系有关,因此也不会产生这种情况。但是在我看来,这是正确的结果,因为它没有冗余。 我想如果非素数属性定义为“不是候选键的属性”,则2NF将产生所需的结果。但是我已经一遍又一遍地检查了这一点,并且非素数属性被定义为“对候选键不信任的属性”。 我究竟做错了什么?

2
星型模式数据仓库中动态字段的EAV替代品
我需要在大型数据仓库中支持动态字段和值以存储API请求日志,而我的用例是我需要存储所有API请求查询字符串,并在将来能够对其进行查询(因此,不仅仅是存储,所以我不能为他们使用blob) 例如 http://example.com/?action=test&foo=abc&bar=def... 我需要存储所有field => value映射,即(action => test), (foo => abc), (bar => def),由于该字段是动态的,所以我发现的唯一解决方案是使用Entity-Attribute-Value,但是,人们一直说这是一个非常糟糕的设计。 因此,考虑以上我的用例,什么是EAV的合适替代方案? 我当前使用KAV的架构 表requests (id, timestamp, uri) 例如(1, 149382220, '/') 表params (request_id, key, value) 例如(1, 'action', 'test'), (1, 'foo', 'abc'), (1, 'bar', 'def') 有什么建议么? 更新:我们在AWS RedShift上运行仓库

5
对于大型应用程序,在同一个数据库的不同模式的表上创建外键是个坏主意吗?
我正在将基于pl / sql网络的大型应用程序传输到专用服务器。此应用程序位于具有70个程序包代码的模式中。在不同的时间大约有15个人进行了此应用程序。对我们来说,通常的做法是在不同模式的引用表上创建外键,因为它确实很方便并且可以使数据库保持整洁,因为我们不需要在不同的模式中保留相同的引用表。 但是无论如何,我的DBA(使用DB创建新实例并在Solaris区域内复制我的应用程序)今天非常苛刻,“不同模式上的外键是邪恶的,您需要销毁它!”。他没有解释他的观点。 在大型应用程序上这样做真的是个坏主意吗?

2
将600GB表索引键数据类型从INT更改为BIGINT的最快方法
我需要将600GB MySQL表中的数据类型从INT更改为BIGINT。该列具有唯一索引。对于未签名的INT,我可能会很好,但是我认为更改为BIGINT或BIGINT会非常痛苦。该表的引擎是InnoDB。什么会更容易: 更改表 复制结构和 INSERT INTO (SELECT *) 转储表和更改转储文件表定义 还要别的吗? 更新:根据要求,MySQL ver 5.5.15,没有外键并创建表: CREATE TABLE `tbl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `created_at` datetime NOT NULL, `tid` bigint(20) NOT NULL, `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `f` tinyint(1) NOT NULL, `i_id` bigint(20) NOT …

4
在150维空间中进行快速最近邻居搜索
我想使用任何可能的RDBMS创建数据库。它将有一个大约150列的表格。目的是对某些其他对象执行最近邻搜索。因此,它是150维空间中的NNS。 我已经尝试使用一些显而易见的方法,例如L1或L2距离,但是对于具有多行的表,当然会花费很多时间。另外,我尝试查看KD树(请注意,我没有对其进行测试)和PG-Strom,但它们并不是多维数据的良好解决方案。 我可以使用数学方法(例如KD-tree)或技术方法(例如PG-Strom)以某种方式提高描述搜索的速度吗? 我将尝试使用允许提高NNS速度的任何RDBMS。但是MySQL和PostgreSQL是最适合我的DBMS。

2
最佳数据建模方法,用于处理有关调查,问题和响应的数据库中的冗余外键
我正在寻找有关最佳关系建模方法以存储调查,问题和响应的建议。 我正在寻找以下两种方法中哪一种看起来最好,或者是另一种替代方法。 我至少有以下实体: 题 调查 人 至少这些关系: 每个调查有1个或多个问题。 每个问题可用于0个或更多调查中。 每个人可能进行0项或多项调查。 这是我遇到麻烦的地方:如何对个人调查问题的回答建模。 这是我考虑过的两种方法,对我来说都不是很好。此处的图已大大简化以说明问题。 方法1: 我不喜欢这种方法: 该survey_person_question_response表有两个引用调查的不同列:survey_question_survey_id和survey_person_survey_id 如果survey_id这两行在一行中引用了不同的,那将是一个错误。survey_question必须与接受survey_person的人来自同一调查。我看不出执行此操作的好方法。 似乎我在这里所做的是在两个关系之间建立关系。由于某种原因,我觉得这很不对劲。 方法二: 尝试避免方法1中的两个FK应该引用相同的值... 我不喜欢这种方法: 没有强制执行,question_id并且survey_idFK来自有效survey_question对 没有强制执行,survey_id并且person_idFK来自有效survey_person对 关于以下方面的任何建议: 这些方法之一是否是典型方法 这些方法之一相对于其他方法的利弊 更好地安排这些数据的更好方法 将不胜感激!

3
具有SQL Server 2016 Shard的多租户系统是否应该通过每个租户通过单独的数据库进行租户隔离?
给定用例: 租户数据不应串扰,一个租户不需要另一租户的数据。 每个租户都可能具有较大的历史数据量。 SQL Server托管在AWS EC2实例中。 每个租户在地理位置上都相距遥远。 有意使用第三方可视化工具,例如PowerBI Embedded 预计数据量会随着时间增长 系统的成本受到限制。 没有24/7生产DBA,解决方案必须可维护 解决方案应该能够水平缩放。 租户总数少于50 推荐的体系结构是什么,此用例是否有参考实现?我相信许多人可能已经在企业软件开发中遇到了这个问题。 我认为这与处理多租户数据库体系结构中越来越多的租户不同。在该问题中提到的用例处理的租户数量更多,这与只有极少数(50)的大租户不同。提到的体系结构可能是这里的解决方案,这是我想进一步了解的。

5
如何隐藏/禁用表而不删除表以检查冗余?
我必须维护和扩展一个旧的旧系统,其中包含不再使用的Web服务方法和数据库表。由于我不能完全确定这些表是否确实是多余的,因此恐怕会删除它们。 还有其他方法可以达到相同的效果(不能再使用表)而不删除它们吗?我的想法是将它们Deleted从当前的默认设置转移到其他模式(例如)dbo。 IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted') BEGIN EXEC('CREATE SCHEMA Deleted') END ALTER SCHEMA Deleted TRANSFER dbo.TableName; 架构方法是否还有其他选择或有任何缺点?

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.