我只是花了一些时间与一位同事讨论了两种可选的数据库设计,但我并不相信。我们都不是严格的 DBA,所以我们可能会遗漏一些东西。
总体目标是为三个(可能是 4 个)实体中的每一个创建附加开放式自由文本属性的能力。
我们将业务实体称为 Device、Location 和 Part;他们之间有关系。
设计 A:创建 DeviceAttribute、LocationAttribute 和 PartAttribute 表,每个表都有一个 ID、参考 ID(FK 到相应的表)、名称、值和类型。
设计 B:创建具有(ID、名称、值和类型列)和三个引用表的属性表 - 每个表保存从实体表之一到属性表 ID 之一的引用。
主要关注的是性能:
- 仅查询实体的数据时,3 个单独的 xxxAttribute 表会表现得更好,例如“给我设备 X 及其所有属性”,还是两种设计的性能相同?- 查询具有给定属性名称/值的实体时,1 属性表(设计 B)是否会表现得更好,例如“给我所有具有 Attribute.Name='GPS' 的实体”,或者是否等同于查询结合了设计 A 的 3 个表?- 在设计 B 的情况下:实体表(位置、设备、部件)上的更新是否会导致锁定其他实体表中的查询?
系统可能有数以万计的部件、数以千计的设备和数百个位置,并且可能必须以每秒数十到数百个查询的数量级进行处理。
我必须设计一个数据库,它最终会在单个表中包含 50M 条记录(还有其他表的记录数较少)。我更关心连接查询和将数据(插入)写入数据库。更新和删除查询会更少。
我已经阅读了这篇关于 Postgresql 与 MySQL 的性能比较的文章。
我也浏览了以下链接。
MySQL vs PostgreSQL:为什么 MySQL 优于 PostgreSQL
我的问题是 stackoverflow 上的一些链接已经过时了。有些人说Mysql更好,反之亦然。
因为我更关心连接查询和将数据写入数据库哪个更适合我?Postgresql 与 MySQL?我应该采取什么方法来设计这样的数据库?
鉴于请不要将此视为另一个 Postgresql vs MySQL 问题。我已经完成了我的研究,我只关心连接查询和将数据写入数据库场景。我还了解到 PostgreSQL 更适合 GIS 数据。.
我正在为我的 ASP.net Web 应用程序设计一个新的 SQL 数据库,我可以预见某些 ID 列在功能需求中会变得非常大INT,BIGINT但这不会持续几年。使用 ASP.net 中的实体框架,更改列数据类型相当容易。所以我想知道,从设计的角度和性能的角度来看,开始使用较小的列类型(如TINYINT和 )SMALLINT并在时间最终到来时增长到INT和是否更好BIGINT?
我们位于德里(印度)的学校希望开发一个专业且强大的内部数据库 (SIS),以处理大量学生信息,包括招生、注册、重新注册、学生行为管理和评分。我们注意到,如果没有大量的定制和成本,现成的产品无法完成我们的特定任务。因此,我们决定自己开发这个,因为我们可以完全控制我们希望如何将我们的信息报告给我们的教育委员会(根据他们的规范),并且可以控制我们复杂的评分系统(不断更新以满足动态我们教育委员会的基准需求)。
我们已经开始使用 MS Access 并且仍处于开发的初级阶段。我们想知道是否应该使用 MS Access 作为前端,SQL Server 作为后端 DB,因为我们要完成以下任务:
能够让80 多名员工用户同时访问、发布、更新和删除 SIS 数据库内的客户记录(在校园内)。
我们的 SIS DB 能够具有基于 Web 的功能,并在我们的学校网站中集成了一个学生登录门户,因此1080 多名学生可以从他们的家中同时访问特定的基于 Web 的 DB 表格(通过使用学生登录门户)以更新个人记录、检查成绩和其他表现总结。
我们的 SIS 数据库能够保持高度安全和 24/7 全天候运行,不会出现中断和安全漏洞(我们了解到,仅靠 MS Access 无法做到这一点)。
能够将我们的 SIS 数据库与另一个内部数据库集成,该数据库将在舒适的家中为学生提供数字学习材料(也可通过学生登录门户访问)。数字学习资料数据库是我们正在创建的另一个数据库,它应该能够存储价值 100 GB 的多媒体资料。
能够无延迟地将数据从表中快速提取到 GUI。
我们学校在这方面的一个主要因素是成本。他们希望创建低于 1,500 美元的数据库,并希望有许多用户能够同时访问该系统。请帮助我决定我应该如何处理这种情况,无论是性能方面还是成本方面。对于提供的冗长细节,我深表歉意。我真的很困惑,如果有人能在这件事上帮助我,我将不胜感激。
此外,我们希望我们的表单像在主要数据库系统中看到的那样专业。我们注意到 Access 可以创建表单,但只能在一定程度上创建。是否有任何其他系统编程友好的平台可以用来创建高度复杂和专业的数据库表单(例如 Visual Studio)?也将非常感谢有关此主题的帮助。
安基斯
我是一名初级 Web 开发人员,我使用 MySQL,有时还使用 MS SQL Server。但是,我没有那么多关于数据库的信息,只有能够构建一些表的基本信息。
现在,如果我的网站发展壮大并且有一天我提高了我的数据库技能,并且我发现我想重新设计我的数据库,那会不会影响我的应用程序的工作方式或不丢失任何数据?
假设您有一张桌子groups和一张桌子item。每个项目都属于一个组。它是该群体的固有组成部分。一个项目不能存在于一个组之外,也不能移动到另一个组中。
当试图决定item表的主键时,我应该使用什么?
我应该像这样组成一个人工全局序列键:
CREATE TABLE items
(
item serial PRIMARY KEY,
group integer NOT NULL REFERENCES groups(group),
);
Run Code Online (Sandbox Code Playgroud)
...或者我应该使用复合键和每组项目序列,如下所示:
CREATE TABLE items
(
group integer NOT NULL REFERENCES groups(group),
item integer NOT NULL,
PRIMARY KEY(group, item)
);
Run Code Online (Sandbox Code Playgroud)
我更倾向于第二种解决方案的原因是帖子 URL 将始终显示组和项目,因此将它们都作为复合主键是有意义的。在第一种解决方案的情况下,URL 包含多余的信息,因为组 ID 已经可以单独从项目 ID 中推导出来。但是,URL 结构是给定的,不能更改。
第二种解决方案的缺点是您必须管理每个组的序列(即每个组的每个项目整数应从 0 开始)。
在最佳实践、规范化和性能方面哪个更好?或者这只是品味问题?
I've recently made a table to hold the language preferences of my users as follow:
CREATE TABLE [dbo].[systemUserLangPreference](
[systemUserID] [int] NOT NULL,
[langID] [int] NOT NULL,
[preferredOrder] [int] NOT NULL,
[createdBy] [int] NOT NULL,
[createdOn] [datetime] NOT NULL,
[lastActionBy] [int] NOT NULL,
[lastActionOn] [datetime] NOT NULL,
CONSTRAINT [PK_systemUserLangPreference] PRIMARY KEY CLUSTERED
([systemUserID] ASC, [langID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
There's …
对象关系映射(以 ActiveRecord 和 Rails 为例)允许程序员定义模型和删除回调之间的关系。
所以我的问题是:我还需要在我的数据库中定义外键吗?外键是否有其他功能(例如速度?),或者它的唯一功能是保持关系完整性?
我正在研究一个每天涉及大量插入的项目。我将有一个用户列表(例如 500k 的用户集),为此我需要每天监视与它们相关的某些活动。
例如,让一组 100 个用户说 U1,U2,...,U100
我需要将他们的每日分数插入到我的数据库中。
考虑用户U1在6月30日-7月6日期间获得的总分如下
June 30 - 99
July 1 - 100
July 2 - 102
July 3 - 102
July 4 - 105
July 5 - 105
July 6 - 107
Run Code Online (Sandbox Code Playgroud)
数据库应该保存每个用户的每日分数,比如
对于用户 U1,
July 1- 1pt (100-99)
July 2- 2pt (102-100)
July 3- 0pt (102-102)
July 4- 3pt (105-102)
July 5- 0pt (105-105)
July 6- 2pt (107-105)
Run Code Online (Sandbox Code Playgroud)
同样,数据库应该保存全套用户的每日详细信息。
在以后的阶段,我设想从这些数据中提取汇总报告,例如每天、每周、每月等的总分;并将其与旧数据进行比较。
我需要从头开始。我有使用 PHP 作为服务器端脚本和 MYSQL 的经验。我对数据库方面感到困惑?既然我每天需要处理大约一百万次插入,那么所有的事情应该注意什么?
MySQL 是否符合我的要求,如果是,应该使用什么存储引擎?最初,我设想创建一个带有外键用户 ID 的用户表和带有日期作为字段的月度评分表。后来我得到建议,先将内容写入 csv/excel,然后在特定时间段后将它们加载到表中。
文件插入是否使事情在这方面更有利。
或者我应该尝试其他一些数据库,NoSQL 方法吗?
编辑 …
在尝试更改 SQL Server 表时添加 DATE 和 FLOAT 列。我收到一条消息:
警告:表“CustomerTransactions”已创建,但其最大行大小超过了允许的最大值 8060 字节。如果结果行超过大小限制,则对该表的 INSERT 或 UPDATE 将失败。
我知道 8K 的限制,但是我很难过,因为桌子没有超过 8K。
DDL 和故障贴在下面。不知道去哪里看得更远。有什么建议吗?
更改表:
ALTER TABLE [dbo].[CustomerTransactions]
ADD
NumericDate FLOAT,
FirstDayOfWeek DATE,
LastDayOfWeek DATE,
NFirstDayOfWeek FLOAT,
NLastDayOfWeek FLOAT,
FirstDayOfMonth DATE,
LastDayOfMonth DATE,
NFirstDayOfMonth FLOAT,
NLastDayOfMonth FLOAT,
HalfMonthStart DATE,
HalfMonthEnd DATE,
NHalfMonthStart FLOAT,
NHalfMonthEnd FLOAT,
HalfOfMonth INT,
FirstDayOfQuarter DATE,
LastDayOfQuarter DATE,
NFirstDayOfQuarter FLOAT,
NLastDayOfQuarter FLOAT,
FirstDayOfYear DATE,
LastDayOfYear DATE,
NFirstDayOfYear FLOAT,
NLastDayOfYear FLOAT
Run Code Online (Sandbox Code Playgroud)
系统列总数
select count(*) NumCols, SUM(sc.length) SumLength
from syscolumns sc
inner …Run Code Online (Sandbox Code Playgroud) database-design ×10
sql-server ×5
mysql ×2
optimization ×2
performance ×2
postgresql ×2
alter-table ×1
ddl ×1
index ×1
ms-access ×1
orm ×1
primary-key ×1