标签: database-design

避免在 SQL Server 的联接中使用复杂的字符串?

我将在 SQL Server 中为客户端创建几个表。对这个问题特别感兴趣的是FactStoreSale要创建表,并DimProduct在其中的第一个表将包括所有门店的销售情况,并包括例如StoreKeyDateKeyTimeKeyProductKey和销售数据。

DimProduct表将在关于产品,使用补充数据,即ProductNameProductGroupProductCategory等这个表将在价格等每个商店而言缓慢改变的尺寸和存储产品的历史。该表将包括列FromDateToDate,它们分别描述了输入数据的时间和替换数据的时间(默认值为 2999 年,ToDate直到插入产品的新更新)。

我相信这是很常见的。但是,ProductKeys来自底层数据库的非常复杂的字符串,例如140-xx4449CH-4.44,9.

在我看来,我的替代方案是Checksum在 SQL Server 中使用将复杂字符串转换为整数,并将它们存储在单独的列中,ProductKeyInt 并在执行 JOINS 时使用这些列。但是校验和不保证唯一的整数值,这可能会导致问题。当我在 Virtual PC 和我自己的 PC 上尝试 Checksum 时,对相同值执行 Checksum 会返回不同的结果,这也是一个问题。我相信这两者一起排除了校验和,除非可以以某种方式操纵它以使其更独特?

另一种选择是使用更复杂的函数来确保将字符串值转换为整数,例如在我的问题中提供的此处。诸如这样的解决方案但也有问题,该值100-xx31003将例如得到同样的结果。从某种意义上说,如果对 SQL 不那么精通的人需要尝试查找使用该函数的 Query 的任何问题,则可能很难理解正在发生的事情,这也很复杂。

我的第三个选择似乎是使用该DimProduct表并首先从 SQL 代理更新该表,然后在该表上使用索引键并将该索引用作FactStoreSale表中的 ProductKeyInt(例如 ProductKeyInt 将是某种子查询FactStoreSale获取与 …

join data-warehouse database-design sql-server t-sql

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

一台服务器中的多个数据库问题

我们公司有 5 个不同的数据库。多个数据库中没有一个涉及或利用跨数据库连接。我们有充足的资源和预算。

我们公司正在争论:

  • 1 个服务器实例上的 5 个数据库,

  • 或 5 个不同服务器上的 5 个数据库。

问题:如果我们将所有内容都放在一台服务器上,可能会出现哪些具体问题、障碍问题?我的背景不是 DBA,所以想学习可以与团队讨论的示例。

背景:

公司 1 个服务器实例的论据:我们有带有故障转移群集的“资源调控器”和“AlwaysOn 可用性组”。资源调控器将处理数据库之间的内存、CPU、io 工作负载。因此,与 AlwaysOn DR 一起,它可以处理失控的查询、糟糕的设计、内存问题。

每个数据库 100GB,关键公司信息,最少 5000 万行

我们每秒处理 300 笔交易

RTO = 10 分钟

performance database-design sql-server availability-groups performance-tuning

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

关系代数中是否有“SELECT * FROM table”的快捷方式?

问题

我曾经在测试中发现的一个问题是这样写的:

报告 ISBN=43221 图书的图书信息

一本书的关系模式如下所示:

π ISBN, title, type, NumPages, edition, sequel, nameISBN=43221 (Book))

这基本上相当于

SELECT * FROM Book WHERE ISBN=43221.
Run Code Online (Sandbox Code Playgroud)

我写出了测试的 Projection 语句中的所有属性,但我觉得有一种更快的方法来做到这一点。

是否有一种快捷方式可以在关系代数中显示一个元组的所有信息,或者必须在 Project 语句中写出所有属性?

database-design relational-algebra

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

具有 metric_name 和 metric_value 列的表的名称

典型的数据库表可能如下所示:

date-------geography---clicks---cost---conversions
___________________________________________________
1/1/2010---Kansas------56-------12-----1
Run Code Online (Sandbox Code Playgroud)

转换后,它看起来像这样。

date-----geography---metric_name---metric_value
____________________________________________
1/1/2010-Kansas------clicks--------56
1/1/2010-Kansas------cost----------12
1/1/2010-Kansas------conversions---1
Run Code Online (Sandbox Code Playgroud)

转置表更适用于收集的指标数量频繁变化的某些用例。

在转置表中是否有类似结构的表的标准名称?

database-design terminology pivot unpivot

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

如何为关系数据库中的不同类型对象建模公共数据?

在当前的项目中,我们正在创建一个应用程序,其中包含一些实体,例如Customer、Project、Company、Ticket、Request 等。这些模型是直截了当的。我无法理解的复杂部分如下:

我们希望有一些可以“附加”到各种对象的公共实体。一些示例包括Documents、Tags 和 Notes。对于上面提到的每个域实体,每一个都应该是可管理的。

在服务器端代码 (Java) 中,我们希望将通用功能实现为组件,并将它们重用/嵌入到我们域对象的特定编辑页面上。我们正在使用 ORM,并且还想重用那些“元数据”类。

我认为这个用例很容易用文档数据库建模。 但是如何在关系模型中做到这一点呢?

database-design

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

使用 JSONB 列或另一个表来保存关系

我试图在这里彻底搜索,但没有找到任何答案。

我有一个 PostgreSQL 数据库,它有两个主表:

  • 文件
  • 用户

这两个表有不同的关系。用户可以:

  • 喜欢
  • 书签稍后阅读
  • 节省

... 一份文件。

问题是我应该如何保存这些关系?

根据我使用 MySQL 的经验,显而易见的方法是为这些多对多关系创建表,包含user_iddocument_id.

但是,因为我们使用PostgreSQL,它具有惊人的JSON支持,我们想也许更好的做法是有一个user_document表,其中包含user_iddocument_idJSON列包含所有关系。

JSON 将是这样的:

{
   'follow' : {'date' : 1523517140, 'doesFollow' : 't'}, 
   'bookmark' : {'date' : null, 'doesBookmark' : 'f'},
   ....
}
Run Code Online (Sandbox Code Playgroud)

我对 PostgreSQL 的经验几乎为零,我不知道在 JSONB 列上查询的性能。而且我不知道这种方法在 PostgreSQL 中是否有意义。但它似乎没问题,如果它没有任何问题,也许它比第一种正常方法更可取。

postgresql database-design json many-to-many

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

具有单独行中的值的“查找”表的名称

我希望在特定情况下命名。当您删除以逗号分隔的列并将其拆分为新表中的单独行时,这种类型的表称为什么?

在下面的例子中,我可以保留FavoriteFoods在最上面的桌子(阿尔伯特爱因斯坦会有“苹果派,汤”),但我希望每种食物都有自己的行。

第二个表是未标准化的“交叉连接”表吗?

如果你知道这个名字,请分享。知道名字后,我会做更多的研究。

上表中的 PersonID 和 Name 以及下表中的 PersonID 和 FavoriteFood

normalization database-design

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

SQL 如何将单租户数据库转换为多租户数据库

我们有一个遗留应用程序。出于某种原因,有人决定为每个客户创建一个数据库。所以我们有 500 多个具有相同架构的数据库。

我想转换成一个多客户端数据库。原始客户数据库没有 CustomerId。新的单一数据库确实如此。

我们正在考虑用视图替换旧的数据库,因此旧的应用程序插入/更新仍然可以工作。

老客户数据库:

CREATE TABLE [CustomerOne].[dbo].[CustomerTransaction]
(
    [CustomerTransactionid] [int] identity(1,1) primary key NOT NULL,
    [QuantityBought] [int] NULL,
)
Run Code Online (Sandbox Code Playgroud)

新报告数据库具有 CustomerId:

CREATE TABLE ReportingDB.[dbo].[CustomerTransaction]
(
    [CustomerTransactionid] [int] identity(1,1) primary key NOT NULL,
    [Customerid] [int] NOT NULL,
    [QuantityBought] [int] NULL,
)
Run Code Online (Sandbox Code Playgroud)

用视图替换旧数据库

create view [CustomerOne].[dbo].[CustomerTransaction]
as
select 
    [CustomerTransactionid]
    ,1 as [CustomerId]
    ,[quantitybought]
from ReportingDB.[dbo].[CustomerTransaction]
where Customerid = 1
with check option
Run Code Online (Sandbox Code Playgroud)

这失败:

-- Attempt inserting into View
insert into CustomerOne.dbo.Customertransaction 
(Quantitybought)
values (4)

Msg 515, Level 16, State …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 database-design sql-server sql-server-2012 sql-server-2016

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

NEWSEQUENTIALID 在许多表的数据库中是唯一的吗?

NEWSEQUENTIALID 在数据库中是唯一的吗?我们用 NEWSEQUENTIALID 在数据库中规划了许多表,同时插入并希望确保每个 guid 都是唯一的,无论它们是否在不同的表中。

常规 NEWID() 将保证数据库中的唯一性,并且有重复的机会是被小行星/闪电击中的机会,但是它们并不能缓解碎片问题。

这篇文章讨论了 Mac 地址,但是我想为上面特定的数据库指定问题。 /sf/ask/1988347511/

performance database-design sql-server sql-server-2016 performance-tuning

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

防止用户更改 MS SQL Server 数据库中的某些列

我想阻止用户更改 MS SQL Server 数据库中的某些列。我无法将该列锁定为 READ ONLY,因为对该列进行了更改。让我尽可能解释清楚。我们的 ERP 允许我通过用户的安全选项卡阻止某些字段/列。听起来很棒。但是,如果一个人使用 ODBC 或 DSN 连接,他们将能够更改数据。例如,我不希望用户能够更改客户订单表中的成本或任何财务内容,但对他更正不正确的地址或运输信息没有任何问题。如果我将表锁定为只读,那么使用 ERP 也会阻止该列。我希望我在这里说得通。谢谢!

database-design sql-server locking

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