标签: database-design

MySQL如何对两个表的继承进行建模

我有一些表格来存储数据,并且根据从事工作的人(工人/文职人员)的类型,我想将其存储在event表格中,现在这些人拯救了一只动物(有一张animal桌子)。

最后,我想要一个表来存储一个人(工人/平民)拯救动物的事件,但是我应该如何添加外键或如何知道id完成这项工作的平民或工人的价值?

现在,在这个设计中,我不知道如何关联哪个人完成了这项工作,如果我只有一种人(又名平民)我只会将civil_idvale存储person在最后一张表的一列中......但是如何知道是民用还是工人,我需要其他“中间”表吗?

MySQL中如何体现下图的设计?

在此处输入图片说明

额外细节

我用以下方式对其进行了建模:

DROP    TABLE IF EXISTS `tbl_animal`; 
CREATE TABLE `tbl_animal` (
    id_animal       INTEGER     NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name            VARCHAR(25) NOT NULL DEFAULT "no name",
    specie          VARCHAR(10) NOT NULL DEFAULT "Other",
    sex             CHAR(1)     NOT NULL DEFAULT "M",
    size            VARCHAR(10) NOT NULL DEFAULT "Mini",
    edad            VARCHAR(10) NOT NULL DEFAULT "Lact",
    pelo            VARCHAR(5 ) NOT NULL DEFAULT "short",
    color           VARCHAR(25) NOT NULL DEFAULT "not defined",
    ra              VARCHAR(25) NOT …
Run Code Online (Sandbox Code Playgroud)

mysql database-design subtypes

20
推荐指数
3
解决办法
7万
查看次数

从单列引用多个表的最佳设计?

提议的模式

首先,这里是我建议的架构示例,供我在整个帖子中参考:

Clothes
---------- 
ClothesID (PK) INT NOT NULL
Name VARCHAR(50) NOT NULL
Color VARCHAR(50) NOT NULL
Price DECIMAL(5,2) NOT NULL
BrandID INT NOT NULL
...

Brand_1
--------
ClothesID (FK/PK) int NOT NULL
ViewingUrl VARCHAR(50) NOT NULL
SomeOtherBrand1SpecificAttr VARCHAR(50) NOT NULL

Brand_2
--------
ClothesID (FK/PK) int NOT NULL
PhotoUrl VARCHAR(50) NOT NULL
SomeOtherBrand2SpecificAttr VARCHAR(50) NOT NULL

Brand_X
--------
ClothesID (FK/PK) int NOT NULL
SomeOtherBrandXSpecificAttr VARCHAR(50) NOT NULL
Run Code Online (Sandbox Code Playgroud)

问题陈述

我有一个衣服表,其中包含名称、颜色、价格、品牌标识等列来描述特定服装项目的属性。

这是我的问题:不同品牌的服装需要不同的信息。处理此类问题的最佳做法是什么?

请注意,出于我的目的,有必要从服装条目开始查找特定于品牌的信息。这是因为我首先将 …

database-design subtypes

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

为什么主键值会改变?

我最近一直在研究 ROWGUID 的概念并遇到了这个问题。 这个答案提供了洞察力,但在提到更改主键值时使我陷入了另一个困境。

我的理解一直是主键应该是不可变的,自从阅读这个答案以来,我的搜索只提供了与最佳实践相同的答案。

在什么情况下需要在创建记录后更改主键值?

database-design primary-key

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

具有快速(<1 秒)读取查询性能的大型(> 22 万亿项)地理空间数据集

我正在为需要快速读取查询性能的大型地理空间数据集设计一个新系统。因此,我想看看是否有人认为在以下情况下有可能或有关于合适的 DBMS、数据结构或替代方法来实现所需性能的经验/建议:

数据将从处理过的卫星雷达数据中不断产生,这些数据将覆盖全球。根据卫星分辨率和地球的陆地覆盖范围,我估计完整数据集可在全球 750 亿个离散位置产生值。在单颗卫星的整个生命周期内,输出将在每个位置产生多达 300 个值(因此总数据集超过 22 万亿个值)。这是针对一颗卫星,并且已经有第二颗在轨,未来几年计划再有两颗。所以会有很多数据!单个数据项非常简单,仅包含(经度、纬度、值),但由于项目的数量,我估计单个卫星最多可产生 100TB。

写入的数据永远不需要更新,因为它只会随着新卫星采集的处理而增长。写入性能并不重要,但读取性能至关重要。该项目的目标是能够通过一个简单的界面(例如谷歌地图上的图层)将数据可视化,其中每个点都有一个基于其平均值、梯度或某个时间随时间变化的函数的颜色值。(帖子末尾的演示)。

从这些需求来看,数据库需要具有可扩展性,我们很可能会转向云解决方案。系统需要能够处理地理空间查询,例如“附近的点(纬度,经度)”和“范围内的点(框)”,并且具有 < 1 秒的读取性能以定位单个点,以及包含多达50,000 点(尽管最好达到 200,000 点)。

到目前为止,我在 1.11 亿个位置拥有约 7.5 亿个数据项的测试数据集。我已经试用了一个 postgres/postGIS 实例,它工作正常,但没有分片的可能性,我不这样做,这将能够随着数据的增长而应付。我还试用了一个 mongoDB 实例,这似乎再次正常到目前为止,使用分片可能足以随数据量扩展。我最近了解了一些有关 elasticsearch 的知识,因此对此的任何评论都会有所帮助,因为它对我来说是新的。

这是我们想要用完整数据集实现的快速动画: Tileserver 为 7.5 亿个数据项提供可视化服务。

这个 gif(来自我的 postgres 试验)提供 (6x3) 预先计算的光栅图块,每个包含约 200,000 个点,生成每个点需要约 17 秒。通过单击一个点,通过在 < 1 秒内拉取最近位置的所有历史值来制作图表。

为长篇道歉,欢迎所有评论/建议。

performance database-design spatial performance-tuning

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

默认约束,值得吗?

我通常按​​照以下规则设计我的数据库:

  • 除了 db_owner 和 sysadmin 之外,没有其他人可以访问数据库表。
  • 用户角色在应用层控制。我通常使用一个 db 角色来授予对视图、存储过程和函数的访问权限,但在某些情况下,我添加了第二条规则来保护一些存储过程。
  • 我使用 TRIGGERS 来初步验证关键信息。

CREATE TRIGGER <TriggerName>
ON <MyTable>
[BEFORE | AFTER] INSERT
AS
    IF EXISTS (SELECT 1 
               FROM   inserted
               WHERE  Field1 <> <some_initial_value>
               OR     Field2 <> <other_initial_value>)
    BEGIN
        UPDATE MyTable
        SET    Field1 = <some_initial_value>,  
               Field2 = <other_initial_value>  
        ...  
    END
Run Code Online (Sandbox Code Playgroud)
  • DML 使用存储过程执行:

sp_MyTable_Insert(@Field1, @Field2, @Field3, ...);
sp_MyTable_Delete(@Key1, @Key2, ...);
sp_MyTable_Update(@Key1, @Key2, @Field3, ...);
Run Code Online (Sandbox Code Playgroud)

您认为,在这种情况下,使用 DEFAULT CONSTRAINT 是否值得,或者我正在向数据库服务器添加额外且不必要的工作?

更新

我知道通过使用 DEFAULT 约束,我向必须管理数据库的其他人提供了更多信息。但我最感兴趣的是性能。

我假设数据库总是检查默认值,即使我提供了正确的值,因此我做了两次相同的工作。

例如,有没有办法在触发器执行中避免 DEFAULT 约束?

performance database-design sql-server t-sql default-value query-performance

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

Oracle 创建 ER 图和数据字典

我是 Oracle 数据库的新手,想为我们现有的数据库开发数据字典和 ER 图。您有任何提示、脚本和工具吗?

oracle database-design

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

列名命名约定和最佳实践

当涉及到列命名时,我想要一些关于最佳实践的专家意见。

背景是,根据维基百科,以下语法,

SELECT ... FROM Employees JOIN Timesheets USING (EmployeeID);
Run Code Online (Sandbox Code Playgroud)

SELECT ... FROM Employees JOIN Timesheets ON (Employees.EmployeeID = Timesheets.EmployeeID);
Run Code Online (Sandbox Code Playgroud)

但是,该JOIN ... USING语法仅适用于所有具有全局唯一名称的主键列。因此,我想知道这是否被认为是正确的做法。

就个人而言,我总是使用 PK columnid和外键 column来创建表othertable_id。但那样就不可能使用USINGor 了NATURAL JOIN

任何指向设计风格或表格设计最佳实践指南的链接也将不胜感激!

join database-design naming-convention

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

为什么我不能使用 NEWSEQUENTIALID() 作为我的列的默认值?

我正在尝试在 Management Studio 中创建一个表,在阅读了新的(从 SQL 2005 开始)NEWSEQUENTIALID()函数后,我想试一试。

这就是我正在做的:

在此处输入图片说明

但它不让我。我得到的错误信息是:

'FormTemplate (Forms)' table - Error validating the default for column 'FormTemplateId'.
Run Code Online (Sandbox Code Playgroud)

我在这里错过了一个技巧吗?我肯定在运行 SQL Server 2008 R2。

sql-server-2008 database-design ssms default-value

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

强制执行数据库完整性

让应用程序强制执行数据库完整性而不是使用外键、检查约束等是否有意义?

如果不通过内部数据库工具强制执行数据库完整性,可以期待多大的性能改进?

database-design sql-server

19
推荐指数
4
解决办法
394
查看次数

SSD 上的 SQL Server 数据库 - 每个表的单独文件有什么好处?

我正在创建一个数据库,其中将有大约 30 个表,每个表包含数千万行,每个表包含一个重要列和一个主/外键列,以便在繁重的情况下最大限度地提高查询效率更新和插入,并大量使用聚集索引。其中两个表将包含可变长度的文本数据,其中一个包含数亿行,而其余的将仅包含数字数据。

因为我真的想从我可用的硬件(大约 64GB 的 RAM,一个非常快的 SSD 和 16 个内核)中挤出每一滴性能,所以我想让每个表都有自己的文件,这样无论是否我加入了 2、3、4、5 个或更多表,每个表将始终使用单独的线程读取,每个文件的结构将与表内容紧密对齐,这有望最大限度地减少碎片并使其更快用于 SQL Server 添加到任何给定表的内容。

一个警告,我被困在 SQL Server 2008 R2 Web Edition 上。这意味着我不能使用自动水平分区,这排除了性能增强。

每个表使用一个文件实际上会最大限度地提高性能,还是我忽略了会使这样做变得多余的内置 SQL Server 引擎特性?

其次,如果每个表使用一个文件是有利的,为什么create table只给了我将表分配给文件组而不是特定逻辑文件的选项?这将要求我为我的方案中的每个文件创建一个单独的文件组,这向我表明 SQL Server 可能没有设想我假设的优势将来自于我的提议。

sql-server-2008 database-design sql-server sql-server-2008-r2

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