标签: database-design

利用触发器动态改变分区函数

我想利用基于 a 的分区[TenantId](稍后与日期范围结合使用)。我不需要在 中手动插入最新值PARTITION FUNCTION,而是考虑创建一个TRIGGER AFTER INSERT来提取[TenantId]值并将ALTER PARTITION FUNCTION其添加到 中SPLIT RANGE。然而,我遇到了一个意想不到的错误:

无法对/使用表“租户”执行 ALTER PARTITION FUNCTION,因为该表是目标表或当前正在执行的触发器的级联操作的一部分。

首先,我创建PARTITION FUNCTION [PF_Tenant_Isolation]PARTITION SCHEME [PS_Tenant_Isolation]以便在 上进行分区[TenantId]

CREATE PARTITION FUNCTION [PF_Tenant_Isolation] ([int])
    AS RANGE LEFT FOR VALUES (1);
GO

CREATE PARTITION SCHEME [PS_Tenant_Isolation]
    AS PARTITION [PF_Tenant_Isolation]
    ALL TO ([Auth]);
GO
Run Code Online (Sandbox Code Playgroud)

接下来,我将[Tenant]根据新创建的分区方案创建表。

IF OBJECT_ID('[Auth].[Tenant]', 'U') IS NULL
BEGIN
    CREATE TABLE [Auth].[Tenant] (
        [TenantId] [int] IDENTITY(1,1)
        ,[TenantActive] [bit] …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server partitioning sql-server-2016

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

连接约 40 个标准化表(200 列)以显示详细的用户配置文件。这个可以优化吗?

一个配置文件可以有多种配置文件类型。该配置文件可以有许多字段,这些字段都与查找表相关联。某些字段可以有多种选择。

\n\n
profile -> profile_date -> one relationship status, one zodiac, many languages, many countries traveled, many cuisines, many activities, ...\n\nprofile -> profile_network -> one company, one school, ...\n\nprofile -> ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

字段的查找表如下所示:

\n\n
id  type\n1   \xe2\x99\x88 ARIES\n2   \xe2\x99\x89 TAURUS\n3   \xe2\x99\x8a GEMINI\n4   \xe2\x99\x8b CANCER\n5   \xe2\x99\x8c LEO\n6   \xe2\x99\x8d VIRGO\n7   \xe2\x99\x8e LIBRA\n8   \xe2\x99\x8f SCORPIO\n9   \xe2\x99\x90 SAGITTARIUS\n10  \xe2\x99\x91 CAPRICORN\n11  \xe2\x99\x92 AQUARIUS\n12  \xe2\x99\x93 PISCES\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果该字段是单个选择,我们将加入查找表,然后就完成了。

\n\n
-> profile_date (zodiac_type_id) -> zodiac_type.id\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果字段是多项选择,则中间有一个用于多对多的联接表。

\n\n
-> profile_date -> (profile_date_id) profile_date_languages (language_type_id) -> language_type.id\n
Run Code Online (Sandbox Code Playgroud)\n\n …

postgresql database-design

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

ID、UUID 和“deleted_at”列,如何避免性能下降?

考虑PostgreSQL上的这张表,但有数千条记录:

\n\n
| id |    uuid | color    | ... |          deleted_at |\n|----|---------|----------|-----|---------------------|\n| 1  | 4fc1... | red      | ... | 2020-01-01 13:00:00 |\n| 2  | 4fc1... | gray     | ... | 2020-01-01 13:00:00 |\n| 3  | 4fc1... | blue     | ... |                null |\n| 4  | 4fc1... | red      | ... |                null |\n| 5  | 4fc1... | blue     | ... | 2019-12-03 00:45:00 |\n
Run Code Online (Sandbox Code Playgroud)\n\n

目的:

\n\n
    \n
  • id(自动增量)用作主键和主要挂钩,以与其他表一起使用 JOIN。
  • \n
  • uuid是用于识别记录的面向公众的值。
  • \n
  • deleted_at(timestamp|null) …

postgresql database-design primary-key index-tuning uuid

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

涉及书籍、作者和国家/地区的场景的实体关系图

当然是一个noobish 问题,但我还是会问它。也许别人会感激。^^

我对 MySQL 越来越熟悉,并且我试图理解创建结构良好的数据库的概念。目前我正在阅读实体关系图(ERD),我问自己:

如果我有三个由第四个链接的表格,例如: 由一个或多个作者撰写的一本书,并且每个作者都在一个或多个国家出版。

authors          books            countries
id | name        id | book        id | publishedInCountry
 1 | ...          1 | ...          1 | ...
 1 | ...          2 | ...          2 | ...
 1 | ...          2 | ...          3 | ...
 4 | ...          1 | ...          3 | ...


linkTable
idOfAuthor | idOfBook   | idOfCountry
 1         | 1          | 1
...
Run Code Online (Sandbox Code Playgroud)

这些 ERD 会是什么样子?

附加信息

我想到了:

[authors]-- < 是 > 的作者 -- [books] …

erd database-design

0
推荐指数
1
解决办法
1277
查看次数

我如何正确设计这个数据库?

我无论如何都不是数据库设计师。我是一名桌面程序员,但我目前正在考虑实现一个需要(可能非常大的)后端数据库的网站创意。

在我的站点中,我将拥有可以创建和加入“组”的用户。用户的数量可能会更多,组的数量也可能更多,并且如果用户愿意,显然可以在多个组中。

我正在努力解决如何在数据库端正确定义它。

我可以创建一个包含所有组信息的“组”表,然后是另一个将每个用户与组相关联的表(因此该表中的每一行都有一个用户 ID,然后是一个组 ID,用户 ID 可以出现在多个行,因为用户可能在多个组中)。对于大量用户,这样的表会变得相当大,尤其是当用户涉及多个组时。

我的一个朋友建议为每个组准备一张单独的桌子。因此,每次用户创建组时,我们都会在数据库中创建一个表,然后用该组中每个用户的用户 ID 填充该表。我对此不太确定,因为为每个组创建一个新表似乎会带来很多开销。

此外,从桌面程序员的角度来看,我真的只想创建一个名为“Group”的类并为其提供一个用户 ID 数组……但显然我不能在关系数据库世界中做到这一点。

那么,我能做什么?设计这个的最佳方法是什么?什么将在服务器上最有效地运行?帮助启发想要学习一点数据库设计的程序员。:-)

谢谢!

database-design

0
推荐指数
1
解决办法
323
查看次数

SQL Server:需要我的白皮书的主键建议

我已经厌倦了向我们研发团队中的每个初级开发人员解释为什么他应该使用主键以及如何使用。所以我决定写一个小白皮书,每个新开发人员都应该阅读。这是它的草稿。

免责声明:

  1. 我知道并理解聚集索引和主键之间的区别
  2. 在以下问题中,PRIMARY KEY 表示 PRIMARY KEY CLUSTERED,而 WITHOUT PRIMARY KEY 表示没有 PK 和 Clustered INDEX
  3. 请注意,这是面向初级而非 SQL 程序员的白皮书
  4. 他们所做的所有事情 - 在进入主要开发分支之前进行审查
  5. 我不会向他们解释——什么时候使用聚集索引和非聚集主键会有好处——否则我会陷入过早的优化地狱

问题是- 我还应该在文档中添加什么?可能是——我应该改些什么呢?更详细的解释是什么?

草稿来了:

  • 主键必须约束数据库中的任何表。
  • 如果没有 PK,一个表被认为是一个堆,而 SQL Server 对这种类型的数据的使用非常有限——我唯一应该说它是合适的——一个用于从 SQL Server 引擎外部快速批量加载数据的缓冲区。
  • 避免使用自然主键。主要是因为它们的自然(高斯)分布。例如,在具有基于 Family 和 Name 的主键的 PhoneBook 表中,Smiths 和 Wilsons 将很多,而 Zimmerbergs 少得多,这表明,包含 Smiths 和 Wilsons 的页面将比其他页面更频繁地拆分,并且也更频繁地查询 - 这成倍增加性能影响。这会导致性能下降,因为主键的页面很满,并且大多数搜索都会命中 PK 的稀疏页面。

此外,即使使用具有(我希望)扁平分布的 SSN 或 ID Number,因为 PK 也不能解决 PK 的页面拆分问题,因为这些数字没有任何组织顺序。

  • 次要 - 自然 PK 通常是复合的。这会创建复合外键和宽索引,从而损害性能。所以, ...
  • 避免使用复合 PK。使用简单代理 PK 和复合 UNIQUE 索引比使用多合一复合 PK …

database-design sql-server database-tuning database-theory

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

添加行是否比添加列更好,以防它们的值不一致?

在我的项目中,我有一张客户表,每个客户对每种产品都有自己的特价,这是一家小型企业,目前大约有 5 种产品。经理说以后可能会有更多的产品,但业务不会超过30个产品。对我来说,不创建特殊产品表而是向客户表添加列(每个新产品 - 新列)更容易。

人们建议我不要这样做,但我没有得到解释为什么仍然无法理解为什么在这种情况下产品的价格没有关系(每个客户都有自己的特价)在产品表中添加行比添加列更好产品到客户表?我能想到的唯一好处是只有 5 个产品的客户不必“携带”20 个可为空的产品(节省服务器空间)?

任何帮助将不胜感激

join database-design sql-server

0
推荐指数
1
解决办法
1271
查看次数

维护插入过多的表

我必须创建一个表。它的大小将会非常快速地增加。

如果在此处提到的同一时刻触发许多插入查询,是否会有任何问题 -用户名的用户自动增量 ID

我想使用密钥,以便在值达到最大可能值后生成值为 1 的下一个密钥。如何实现?旧数据没有用,所以我可以删除起始行的数据。我知道 UNSIGNED BIGINT 的范围很大,但是有什么方法可以使用触发器创建数据库,以便键重用旧值?尝试编写用户定义的函数来实现这一点有什么缺点?

mysql database-design primary-key

0
推荐指数
1
解决办法
372
查看次数

寻找可扩展的关系数据库

我正在寻找实现以下目标的数据库:

  1. 完全酸性。
  2. 与连接相关。
  3. 有交易。
  4. 允许管理员指定分片规则(例如:来自欧洲的用户应该位于欧洲数据中心)。
  5. 最苛刻的要求:在网络分区时,就像两个数据中心相互断开连接一样,每个数据中心都应该能够读取和写入其中的节点。基本上,我愿意为了分区容错而牺牲部分可用性。可悲的是,大多数解决方案都会在出现裂脑的情况下停止所有读取和写入。(因此,优先于可用性而不是分区容错性)

我更喜欢开源解决方案,但也愿意考虑专有解决方案。

database-design database-recommendation scalability relational-theory

0
推荐指数
1
解决办法
139
查看次数

如何用 UNIQUE 索引和外键表示它?

“组”是一群学生。“话题”是课程的话题。

每个组对应一个主题。(因此每个主题可能有多个组。)

一个学生对应多个组,但每个主题最多一个组。

如何根据 MySQL 中的 UNIQUE 索引和外键实现这一点?

foreign-key database-design

0
推荐指数
1
解决办法
337
查看次数