我需要创建一个车辆跟踪数据库。有几辆车向我的数据库发送包含大约 20 个参数的数据。
车辆的参数包括常数vehicle number和hardware id,以及各种变量项。
我将在此数据库中有一个包含用户登录凭据的表,我想在两个表之间创建一个链接,其中车辆编号作为登录表中的主键,车辆编号作为包含参数的表中的主键。
由于车辆号码列是多余的,我不能将其作为主键。
我想知道:
这是我第一次设计数据库。迄今为止我只是一名程序员。
什么是良好/健康的 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 的值都适合健康的数据库?
是否可以有一个基于 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) 我们有一个相当大的数据库(大约700GB的数据),这是我们继承的,并且有几个DBA。随着时间的推移,我们意识到有几个丢失的外键和索引。
我想知道是否有某种自动方法可以使用某种日志解析或类似的方法来发现此类潜在丢失的键/索引。
我的系统需要存储一个仅附加的事件日志。目前我有一个数据库表,将所有相关数据存储在一个表中:
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) 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
多年来,我们一直在使用具有糟糕且低效的数据库结构的单体程序。现在我们终于用我们自己的程序摆脱了它。
我们唯一遇到困难的领域是数据库。我们的数据是财务数据,我们现有的程序主要通过覆盖 ( UPDATE, DELETE)导致数据丢失。我们决定采用仅追加的结构来保存我们积累的所有数据。如果仓库增长超过我们最初的估计,我们可能会考虑使用它,但与此同时,我们预计数据库会在几年内增长到一些较大表的数百万行;在这一点上规模不大。
我们使用PostgreSQL,将被拒绝修改特权,比如UPDATE与DELETE用户,以确保数据的一致性历史。
我们认为我们可以将所有当前和历史数据包含在一个表中,以便我们查询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 …
我有一个包含 70 个问题的问卷,需要存储答案。
问题:每年有 1 亿条记录。
我有使用不同类型存储的经验,但从来没有处理过这些庞大的数字。现在我担心每一个错误的决定都可能导致巨大的负面影响。
信息有关数据:
数据定义(伪代码)
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) 我正在开发一个关于反义词、同义词和“类似说话”词的简单语言游戏。
如果您在“同义词屏幕”中玩游戏,游戏将向您显示两个同义词和两个不相关的单词,您必须猜测哪个是同义词。
如果您在“反义词屏幕”中玩游戏,游戏将向您显示两个反义词和两个不相关的单词,您必须猜测哪个是反义词。
如果您在“说话屏幕”中玩游戏,游戏会向您显示两个“相似的说话”词,每个词都会说一个,您必须猜测哪个是。
我的问题是您可以有多个同义词,例如:
愤怒:被激怒、愤怒、愤怒、被冒犯等。
爱:亲情、激情、奉献等。
我的第一个想法是这样的:
表同义词:
+-----------+-------------------+
| 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) 您将如何保留数据库中所有表的每个值的完整历史记录,可以使用特定日期(对于所有表的每一列)进行查询?我的意思是:人们只需要指定一个日期,该日期的值是“活动”或“有效”。
以一种愚蠢的方式,我会在每个表中添加一个“有效期开始日期”列。而不是复制每个值,我只会复制更改的值,并将所有其他列设置为 NULL。然而,这个解决方案真的很糟糕,因为它使查询复杂化,即使它占用的空间更少。
是否有一种特定的技术(我在 Microsoft 世界中)可以做到这一点,或者有一种特定的方法来为数据库建模来做到这一点(除了为每个表的每一列创建一个表)?
我想提一下,我不是 DBA 而是开发人员。赞!赞!
database-design ×10
mysql ×3
postgresql ×3
optimization ×2
sql-server ×2
t-sql ×2
dml ×1
foreign-key ×1
index ×1
performance ×1
timestamp ×1