标签: database-design

我如何优化这个数据库设计?

我需要创建一个车辆跟踪数据库。有几辆车向我的数据库发送包含大约 20 个参数的数据。

车辆的参数包括常数vehicle numberhardware id,以及各种变量项。

我将在此数据库中有一个包含用户登录凭据的表,我想在两个表之间创建一个链接,其中车辆编号作为登录表中的主键,车辆编号作为包含参数的表中的主键。

由于车辆号码列是多余的,我不能将其作为主键。

我想知道:

  1. 有什么办法可以实现表之间的链接
  2. 有没有一个好的方法可以让我不多次存储这个车号和硬件ID。
  3. 我应该将每辆车的数据存储在单独的表中而不是全部存储在一个表中吗?

这是我第一次设计数据库。迄今为止我只是一名程序员。

database-design

2
推荐指数
1
解决办法
1024
查看次数

什么是良好/健康的 mysql 查询执行时间?

什么是良好/健康的 mysql 查询执行时间?

根据我的计算:

该网站每小时有 1000 名独立访客

每个独立访问者 10 次页面浏览

每个唯一访客 5 分钟(我忽略了这一点。我应该这样做,对吧?)

1000*10=10000/(60*60) = 每秒 2.7 次观看。

我每页都有 3 个查询。2.7*3 = 每秒 8.1 次查询

1 秒/8.1 = 0.123

因此平均查询执行时间必须小于 0.123。

假设访问量没有增加,我们是否可以说任何小于 0.123 的值都适合健康的数据库?

mysql database-design

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

T-SQL 基于标识列插入值

是否可以有一个基于 Identity 列的具有 PK 的表?

假设我有一个客户表,两个字段对于我们的案例很重要,Id即 isPK nvarchar(20)SequenceIdwhich is int identity(1,1)。我想要一个存储过程,该过程将具有(除其他外)一个参数@CustomerType,并根据此参数生成值Id并将新行插入表中。像这样的东西:

CREATE PROCEDURE createCustomer
@CustomerType int, 
@GivenName nvarchar(20), 
@Surname nvarchar(20), 
@BirthDate date = null
...
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @prefix nvarchar(1) = N'x'
    IF @CustomerType = 1
    BEGIN
        SET @prefix = N'P'
    END
...
    ELSE
    BEGIN
        SET @prefix = N'x'
    END

    INSERT INTO [dbo].[Customers]
           ([Id],
            [GivenName],[Surname],[BirthDate])
    VALUES
           (@prefix + (SequenceId + 1000000),
        @GivenName,@Surname,@BirthDate);

    SELECT INSERTED.Id AS CustomerId; …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server dml t-sql

2
推荐指数
1
解决办法
5252
查看次数

发现丢失的外键和/或索引

我们有一个相当大的数据库(大约700GB的数据),这是我们继承的,并且有几个DBA。随着时间的推移,我们意识到有几个丢失的外键和索引。

我想知道是否有某种自动方法可以使用某种日志解析或类似的方法来发现此类潜在丢失的键/索引。

postgresql index foreign-key database-design

2
推荐指数
1
解决办法
2812
查看次数

我应该重新设计我的“事件”表

我的系统需要存储一个仅附加的事件日志。目前我有一个数据库表,将所有相关数据存储在一个表中:

CREATE TABLE `events` (
        `event_id` VARCHAR(255) NOT NULL PRIMARY KEY,
        `event_type` VARCHAR(255) NOT NULL,
        `event_timestamp` DATETIME,
        `group_id` VARCHAR(255),
        `person_id` VARCHAR(255),
        `client_id` VARCHAR(255),
        `name` VARCHAR(768),
        `result` VARCHAR(255),
        `status` VARCHAR(255),
        `logged_at` DATETIME,
        `severity` VARCHAR(255),
        `message` LONGTEXT,
        INDEX `event_type_index` (`event_type`),
        INDEX `event_timestamp_index` (`event_timestamp`),
        INDEX `group_id_index` (`group_id`),
        INDEX `person_id_index` (`person_id`),
        INDEX `client_id_index` (`client_id`),
        INDEX `name_index` (`name`),
        INDEX `result_index` (`result`),
        INDEX `status_index` (`status`),
        INDEX `logged_at_index` (`logged_at`),
      ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8_general_ci
Run Code Online (Sandbox Code Playgroud)

但是我注意到在 WHERE 子句中具有多个属性的查询仍然很慢。例如:

SELECT
  count(e.event_id) as total
FROM events e
WHERE
  e.result='Success' …
Run Code Online (Sandbox Code Playgroud)

mysql database-design optimization

2
推荐指数
1
解决办法
138
查看次数

Should I split timestamp parts into separate columns?

I am building a PostgreSQL database and I have created a timestamp table, where the primary key is the timestamp itself (e.g. id: Fri Apr 13 2018 15:00:19). The database is supposed to be later migrated to a data warehouse, from which analytics will be extracted.

At this point, I am wondering whether it is beneficial to add extra columns to the timestamp table, containing the parsed metrics such as the example below, or have a single table with …

postgresql performance database-design optimization timestamp query-performance

2
推荐指数
2
解决办法
301
查看次数

如何在 PostgreSQL 中构建仅附加数据库?

前言

多年来,我们一直在使用具有糟糕且低效的数据库结构的单体程序。现在我们终于用我们自己的程序摆脱了它。

我们唯一遇到困难的领域是数据库。我们的数据是财务数据,我们现有的程序主要通过覆盖 ( UPDATE, DELETE)导致数据丢失。我们决定采用仅追加的结构来保存我们积累的所有数据。如果仓库增长超过我们最初的估计,我们可能会考虑使用它,但与此同时,我们预计数据库会在几年内增长到一些较大表的数百万行;在这一点上规模不大。

我们使用PostgreSQL,将被拒绝修改特权,比如UPDATEDELETE用户,以确保数据的一致性历史。


我们的理念

我们认为我们可以将所有当前和历史数据包含在一个表中,以便我们查询timestamp每个记录的最后一条(或最新),id如下表所示。

澄清一下,我们有几十个表;下面代表一个这样的表的简单版本。

????????????????????????????????????????????????????
? key ? id ? field1 ? field2 ? timestamp           ?
????????????????????????????????????????????????????
? 0   ? 0  ? a      ? b      ? 1970-01-01 00:00:01 ?
????????????????????????????????????????????????????
? 1   ? 1  ? x      ? y      ? 1970-01-01 00:00:02 ?
????????????????????????????????????????????????????
? 2   ? 0  ? a      ? c      ? 1970-01-01 00:05:01 ? # new version of id=0 row
????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我们还考虑了 NoSQL …

postgresql database-design

2
推荐指数
2
解决办法
5492
查看次数

哪个数据库用于每年 1 亿行的 1 个表?

我有一个包含 70 个问题的问卷,需要存储答案。

问题每年有 1 亿条记录

我有使用不同类型存储的经验,但从来没有处理过这些庞大的数字。现在我担心每一个错误的决定都可能导致巨大的负面影响。

信息有关数据

  • 我在想一张70 列的表
  • 列已经定义,一段时间后可能会稍微调整(+/- 10 列)
  • 每列的数据类型是主要整数和字符串大多2字符,最大值 10 个字符。
  • 不需要嵌套(树)结构
  • 不需要灵活的数据类型
  • 不需要加入

数据定义(伪代码)

COLUMN           |   TYPE   | MAX. LENGTH
-----------------------------------------
id               | Integer  | 10  
questionnaire_id | Integer  | 10
answered_at      | Datetime | -
answered_by      | Integer  | 10
answer1          | Integer  | 2
answer2          | Integer  | 2
answer3          | Integer  | 2
answer4          | Integer  | …
Run Code Online (Sandbox Code Playgroud)

data-warehouse database-design

2
推荐指数
1
解决办法
2084
查看次数

如何使用相互关联的单词设计关系数据库

我正在开发一个关于反义词、同义词和“类似说话”词的简单语言游戏。

如果您在“同义词屏幕”中玩游戏,游戏将向您显示两个同义词和两个不相关的单词,您必须猜测哪个是同义词。
如果您在“反义词屏幕”中玩游戏,游戏将向您显示两个反义词和两个不相关的单词,您必须猜测哪个是反义词。
如果您在“说话屏幕”中玩游戏,游戏会向您显示两个“相似的说话”词,每个词都会说一个,您必须猜测哪个是。

我的问题是您可以有多个同义词,例如:

愤怒:被激怒、愤怒、愤怒、被冒犯等。
爱:亲情、激情、奉献等。

我的第一个想法是这样的:

表同义词:

+-----------+-------------------+  
|   word    |     related       |  
+-----------+-------------------+  
| angry     |   enraged         |  
| angry     |   furious         |  
| angry     |   irated          |  
| angry     |   offended        |  
| enraged   |   furious         |  
| enraged   |   irated          |  
| enraged   |   offended        |   
| furious   |   irated          |  
| furious   |   offended        |   
| irated    |   offended        |   
| love      |   affection       |  
| love      |   passion         |  
| love      |   devotion …
Run Code Online (Sandbox Code Playgroud)

mysql database-design

2
推荐指数
1
解决办法
67
查看次数

保留每个表中每个值的完整历史记录

您将如何保留数据库中所有表的每个值的完整历史记录,可以使用特定日期(对于所有表的每一列)进行查询?我的意思是:人们只需要指定一个日期,该日期的值是“活动”或“有效”。

以一种愚蠢的方式,我会在每个表中添加一个“有效期开始日期”列。而不是复制每个值,我只会复制更改的值,并将所有其他列设置为 NULL。然而,这个解决方案真的很糟糕,因为它使查询复杂化,即使它占用的空间更少。

是否有一种特定的技术(我在 Microsoft 世界中)可以做到这一点,或者有一种特定的方法来为数据库建模来做到这一点(除了为每个表的每一列创建一个表)?

我想提一下,我不是 DBA 而是开发人员。赞!赞!

database-design sql-server t-sql

2
推荐指数
1
解决办法
62
查看次数