我正在尝试提高由实体框架自动生成的特定查询的性能。我已经通过 SSMS 运行了查询,它建议创建两个缺失的索引。有问题的表:
CREATE TABLE [dbo].[PackageEvents]
(
[EventID] [int] NOT NULL IDENTITY(1, 1),
[PackageID] [char] (24) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[EventDescription] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[EventDate] [datetime] NOT NULL,
[UserName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Notes] [varchar] (max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[IsSynchronized] [bit] NOT NULL CONSTRAINT [DF_AmazonPackageEvents_IsSynchronized]
DEFAULT ((0)),
[LastSyncDate] [datetime] NULL,
[Version] [timestamp] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
SSMS 建议了以下两个索引:
CREATE NONCLUSTERED INDEX [IX_IsSynchronized] ON [dbo].[PackageEvents]
([IsSynchronized]) INCLUDE ([PackageID])
CREATE NONCLUSTERED INDEX [IX_Covering] ON [dbo].[PackageEvents] ([PackageID])
INCLUDE …Run Code Online (Sandbox Code Playgroud) 选项A:
表A:
表B:
表C:
表D:
组合键 (TableA_ID,TableB_ID,TableC_ID)
我正在考虑将 TableD 设计如下(OptionB)
表D:
我的应用程序将需要使用 TableD 作为搜索 TableB_ID 和/或 TableC_ID 列中的值,方法是提供 TableA_ID 中的值的键。
我只是想知道哪个选项会更好的性能。
我正在创建一个用于管理事件的 Web 服务。该服务将拥有列在一个名为“用户”的数据库中的用户。它还具有在另一个称为事件的数据库中列出的事件。
每个事件都会有一个受邀用户列表,该列表的长度是可变的。每个受邀用户都有各种属性,包括他们是否接受了邀请,以及他们是否参加了。
我打算使用 SQL 数据库;SQLite、MySQL 或 PostgreSQL。但是,如果有人建议,这可以改变。
我的问题是我应该如何存储每个事件的受邀用户信息?要求是:
我可以同样轻松地查找受邀参加活动的用户和邀请用户参加的活动。
该解决方案是可扩展的,即如果我最终拥有数百万用户和数百万事件,那么该方法可以应对。请注意,每个活动只会有少量客人,例如 2-1000。
该解决方案在访问时间、计算资源和存储要求方面是高效的。
我想到的一些选择:
对于每个事件来宾列表,将用户 ID 和其他属性作为 blob 或每个属性的 blob 存储在事件数据库中。这里的问题是客人的数量各不相同。固定长度意味着浪费空间或限制最大来宾长度大小。此外,这种方法不允许快速查找用户受邀参加的活动。
对于每个用户,将他们受邀参加的事件列表以及其他属性存储为用户数据库中的 blob。同样,问题在于事件的数量不同,并且这种方法不允许快速查找受邀参加事件的用户。
1 和 2 的组合。这引入了冗余,以及在保持两个数据库同步时发生错误的可能性。
每个事件用户列表的单独 SQLite 数据库。我怀疑这在存储和计算上都非常低效。此外,它不允许轻松计算邀请用户的事件。
另一个存储用户事件项目的数据库,每个用户被邀请参加每个事件。这必须允许按用户或事件进行快速过滤。我是数据库的新手,所以不知道这是否可以在 SQL 数据库中实现,或者需要其他类型,如果可以,是什么。
非常感谢您对这些选项的评论以及任何进一步的建议。
我有 400,000 条记录需要分区。记录将每年增加 100,000 条,这些新记录可能需要添加 1000 个新分区。
以下是我的一些担忧:
例子:
假设 100,000 条中的 10,000 条需要分成 100 条记录的分区,因此将创建 1000 个分区,并创建 9 个额外的分区,每个分区包含 10,000 条记录,总共 1009 个分区。
问题:
笔记:
这个问题是针对有经验的开发人员的。
我的朋友最近告诉我,他的雇主有一个遗留代码库,其 MySQL 数据库的大小现在已经增长到 800 GB 左右。有趣的是,很少有外键约束,导致一些重复的坏数据,但由于这不会损害任何东西(显然),没有人会过度担心。
现在我无法想象没有外键的生活,所以当我问他为什么没有这样的检查时,他回答说外键是数据库必须维护的另一个索引,占用更多空间。
是的,空间。所以这是我的问题:索引可以占用多少空间?10% 的数据库?20%?即使他的推理是错误的,不可否认外键会导致性能下降。作为一名开发人员,一旦数据库大小接近 1 TB,您会放弃外键,而是依靠代码来进行适当的内务处理吗?
我正在为跟踪有关我公司的数据库开发项目的信息的应用程序设计数据库。项目管理办公室 (PMO) 根据项目的成本是否计入合并整合,为每个项目分配一个伪编号。举例来说,分配的数字将以INT(对于有助于合并整合的项目)或NINT(对于不有助于合并整合的项目)开头。然后分配一个序列号。例如,INT175将是第 175 个确定有助于合并整合的项目。另一个问题是 PMO 有时希望创建多个具有相同编号的项目,因为它们是“相关的”。因此,例如可能有一个 INT175 a项目、INT175 b项目等。
虽然 PMO 认为这个数字是项目的标识符,但在数据库中,我只会将该列用作备用唯一键,以确保不会创建重复的项目并作为用户的搜索键。我想对该列实施检查约束,以确保只能输入与我上面给出的规则匹配的有效数字。
我的第一个想法是使用正则表达式。在 Oracle 中,我的目标 DBMS,我们有可以使用的 REGEX_LIKE 函数。我研究了关于正则表达式的文档(这里、这里、这里、这里和这里),发现这些选项令人眼花缭乱!无论出于何种原因,我的大脑都在试图获取所有各种模式匹配选项的列表并将其应用到我的特定示例中。我是最擅长使用示例的人之一。不幸的是,我还没有找到很多例子。我发现的东西要么太简单,要么太复杂,我无法理解它们。
到目前为止我尝试过的是这样的:
select c
from (
select 'INT1756b' c from dual union all
select 'INT175a' c from dual union all
select 'INT75a' c from dual union all
select 'INT75' c from dual union all
select 'NINT2283a' c from dual union …Run Code Online (Sandbox Code Playgroud) 我目前正在为一家保险公司进行数据库设计。示例实体是“客户”、“地址”、“车辆”、“建筑物”等。所以有很多关系,每个关系都有一些上下文。例如,客户车辆:客户可以是车辆的所有者、司机、承租人……基本上我看到两种处理方式:
(1):每个关系的连接表,带有两个外键和一个上下文 ID。这将导致许多联结表,其中部分数据很少。由于表的数量,选择会有点困难。
(2):整个数据库的一个连接表。该表将包含两个外键,一个是关于它是什么关系的键(例如客户-车辆)和一个用于上下文的键。这将导致一个巨大的连接表,但也更简单的选择。
哪个是更好的解决方案?有什么主要的优点/缺点,甚至是我没有想到的其他解决方案吗?
感谢您的帮助。如果我表达的不够清楚或有什么不明白的地方,请提问。(英语不是我的母语)
我有一个当前看起来像这样的数据库表:
PageField
-Id (Int, PK)
-FieldType (String) Can be Text, Decimal, Integer or Bit
-Value (This stores the value regardless of the FieldType, so it is not strongly typed)
Run Code Online (Sandbox Code Playgroud)
我是否应该删除Value列并将其替换为 4 个单独的列TextValue、DecimalValue、IntegerValue和BitValue吗?
数据类型将设置为相关内容。这意味着在这 4 列的每一行中,第 3 列将是NULL.
我正在构建一个管理 POS 系统定义的数据库(菜单项、收银员等)。它将包括许多商店和许多版本。
因此,典型的表将如下所示(MenuItems 表)...
StoreID PK
VersionID PK
MenuItemID PK
MenuItemName
Run Code Online (Sandbox Code Playgroud)
但我想将 StoreID 和 VersionID 合并为一个代表商店和版本的 ID(因此,商店 101 的版本 5)。所以,我简化了每个表上的主键(因为每个表都需要这个)
然后让我的桌子看起来像这样......
SomethingID PK
MenuItemID PK
MenuItemName
Run Code Online (Sandbox Code Playgroud)
请帮我命名 StoreIDAndVersionID 字段。我不知道该怎么称呼它。
database-design ×10
constraint ×1
eav ×1
index-tuning ×1
mysql ×1
partitioning ×1
postgresql ×1
regex ×1
sql-server ×1