Questions tagged «database-design»

数据库的概念模式和/或逻辑模型和/或物理设置的开发。


3
具有多个变体/属性的产品的架构设计?
我正在使用MySQL。这个想法类似于具有不同概念的shopify,因此用户将添加具有多种变体和属性类型的自己的产品。 从我所做的所有研究来看,这似乎是我最可能的解决方案,我只是想知道以下方案是否存在问题,还有哪些优点/缺点? 谢谢 Table: products ------------------------------ | ID | ProductName | |----------------------------| | 1 | Leather Wallet Case | | 2 | Jeans | | 3 | Power Bank | Table: products_variants ------------------------------- | ID | ProductId | ParentId | Variant | VariantName | SKU | StockTotal | WholeSalePrice | …

4
正确的存储值的方式可能是多种不同的类型
我有一个答案表和一个问题表。 答案表中有值,但根据问题,这个值可以是一个bit,nvarchar或number(到目前为止)。该问题具有其预期答案值类型应为什么的概念。 在一个或另一个点解析这些Answer值非常重要,因为至少需要对这些数字进行比较。 对于更多情况,一些用户在各种调查中提供了问题和可能的答案(通常是文本框类型输入所允许的数据类型)。然后,其他指定的用户将提供答案。 我考虑过的几个选项是: A. XML或字符串,根据所需的类型进行不同的解析(在问题中始终保持跟踪) B.引用答案表(或由答案表引用)的三个单独的表,并根据预期的类型联接到其中。在这种情况下,我不确定设置约束的最佳方法,以确保每个问题只有一个答案,或者应该将其留给应用程序。 C. Answer表上的三个独立列可以根据预期的类型进行检索。 我很高兴就这些方法的优缺点获得一些意见,或者我没有考虑过的替代方法。

3
历史/时间表的最佳做法?
假设我有一个对象,其中包含我要跟踪历史记录的某些字段,以及某些我不想跟踪历史记录的字段。从规范化的角度来看,以下架构是否正确: CREATE TABLE MyObject AS ( MyObjectId INT IDENTITY NOT NULL PRIMARY KEY, MyObjectField1 VARCHAR(100) NOT NULL, MyObjectField2 VARCHAR(100) NOT NULL, MyObjectField3 VARCHAR(100) NOT NULL, MyObjectTrackedField1 VARCHAR(100) NOT NULL, MyObjectTrackedField2 VARCHAR(100) NOT NULL, MyObjectTrackedField3 VARCHAR(100) NOT NULL, ) CREATE TABLE MyObjectHistory AS ( MyObjectHistoryId INT IDENTITY NOT NULL PRIMARY KEY, …



3
关系数据库中的完整性约束-我们应该忽略它们吗?
我正在与我工作的公司的开发人员进行永久性讨论,因为他们说最好摆脱关系数据库中的关系强制(通过FOREIGN KEY约束定义),以便加快大型查询并获得更好的结果。性能。 所考虑的平台是MySQL 5.x,并且尚未设置FOREIGN KEY,甚至缺少相关表的一些PRIMARY KEY约束,至少对于我来说,这是不合理的。也许他们是对的,但我是错的,但我没有足够的论点来讨论这种情况。 三年来,这一直是首选方法。我是这家公司的新手(只有一个月),但是随着产品的“上市”,人们在犹豫是否要增强数据库。话说回来,我注意到的第一件事是一页需要1分钟的加载时间(是的,需要60秒!)。 当前事务状态背后的一种说法是,“非规范化”数据库比规范化数据库要快,但我认为那不是真的。 大多数相关查询都包含JOIN操作,这使它们在处理大量数据(数据库包含数百万行)时非常非常非常慢地运行。 通常,“ CRUD”操作的处理是在应用程序代码级别实现的;例如,为了删除一些数据自,例如TableA: 必须首先即时检查TableA和的行之间是否存在某种关系TableB, 如果上述关系被“检测到”,则应用程序代码将不允许删除相关行,但是 如果由于某种原因该应用程序代码失败,则无论涉及的行和表是否存在任何关系,DELETE操作都将“成功”进行。 题 您能帮我拟定一个良好,准确而可靠的答案以丰富辩论的内容吗? 注意:也许以前有人问过(并回答过)类似的问题,但是我无法通过Google找到任何东西。

3
如何避免3个表之间的循环依赖关系(循环引用)?
我有3张桌子: 人 发布 喜欢 当我设计ER模型时,它具有循环依赖性: 1:N 人-------- <帖子 1:N 发表---------- <喜欢 1:N 人-------- <喜欢 逻辑是: 1人可以发表很多帖子。 1个帖子有很多赞。 1个人可以喜欢许多帖子(创建的人不能喜欢自己的帖子)。 如何删除这种循环设计?还是我的数据库设计错误?

5
计算表的行大小和最大行大小
问题: 有什么方法可以计算表创建所占用的字节数,我知道您可以从information_schema.tables中获取一些信息,但是该信息不够准确。 实际需要的是根据表定义(仅针对innodb的字节数),归类也可以视为utf-8-general-ci 例如表测试如下 创建表测试 ( col1 varchar(25), col2 int, col3 varchar(3), col4 char(15), col5 datetime ); 现在需要根据表中的列类型知道一行中可以累积的总行大小。 在MSSQL中找到了某种类似的解决方案,但需要其MySQL版本 用于估算任何表的行大小的脚本 任何帮助深表感谢。

2
在订单表中存储帐单地址最佳做法
有人可以帮助我了解此用户对CustomerLocation表的回答。我真的想要一种在订单表中存储地址的好方法。 我要寻找的是如何设置地址,以便在编辑地址时,订单不会受到客户更新其地址或重新安置地址的影响。 就目前而言,我的架构类似于: Person |EntityID| EntityAddress |EntityID|AddressID| Address |AddressID|AddressType|AddressLine1|AddressLine2| Order |OrderID|BillingAddressID|

3
为什么不分区?
什么时候不希望对数据库进行分区?(考虑MySQL分区) 就我而言 我将从几百万行开始,应该从那里开始。 字符字段上的主键用作最频繁的查询约束(并且查找也很频繁-至少每秒几次)。 主键将被散列为分区键 将对上述频繁查询中提取的每一行进行更新 频率较低的查询(针对日期列或其他查询)将需要访问所有分区 即使到最后一点,查找也不是并行运行的,因此在所有情况下,这都是胜利吗?分区的不利之处是什么?为什么至少在查看百万条记录时,每个人都默认不使用它? 更新-我选择了zgguy的答案,但请注意,我在自己的研究结果中添加了自己的答案,其中包括指向对我非常有用的类似问题的非常好的答案的链接。

1
确保时态数据库设计中唯一条目的正确方法是什么?
我在设计时态数据库时遇到了麻烦。我需要知道如何确保商店的给定时间范围内只有一条活动记录。我已经读过这个答案,但是恐怕我无法围绕触发器的工作原理来解决。特别是,我将如何触发现有的触发器,以防止对记录进行更新,而是插入一条新记录。我的真正问题是,当完成日期为null时,我不知道如何防止商店拥有多个生效日期。(即防止2条活动记录的商店)。 这就是我所拥有的,但是它允许我为具有不同生效日期的商店插入新记录。 表定义: /****** Object: Table [PCR].[Z_STORE_TEAM] Script Date: 05/09/2014 13:05:57 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) DROP TABLE [Z_STORE_TEAM] GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) BEGIN CREATE TABLE [Z_STORE_TEAM]( [STORENUM] …

1
用于处理10亿行和计数的数据库设计
我们以大约5000 pr的速率接收实时GPS数据。分钟(来自4个TCP服务器)。每个服务器使用单个连接来插入数据,并在两次插入之间缓冲数据。每隔15分钟左右,服务就会获取一次此数据,并将其处理为行程。生成行程后,仅当用户希望在地图上查看路线时,实际的GPS数据通常并不那么重要。 问题是数据库似乎在努力跟上插入数据的速度。有时,当负载增加时,插入时间突然急剧增加(> 30秒),这又使更多数据得以缓冲,从而导致更大的插入量和更长的插入时间。 我希望能对当前的设计发表一些评论,以及一些我们必须提高性能的想法,并回答我们的一些问题-以及人们可能拥有的其他技巧! 当前设计 当前将数据分为代表一周的表格,并且将早于一年的数据存档到辅助数据库中。整个事物在可编辑视图中连接在一起,该视图用于插入和读取。 桌子设计 ID(PK,唯一标识符) DeviceId(FK,int) PersonId(FK,int) VehicleId(FK,int) TokenId(FK,int) UtcTime(PK,datetime2(3)) 纬度(浮动) 经度(浮点) 速度(smallint) 标题(smallint) 卫星(tinyint) IOData(varbinary(100)) IgnitionState(tinyint) UserInput(tinyint) CreateTimeUtc(datetime2(3)) 指标 DeviceId_CreateTimeUtc_Desc DeviceId_UtcTime_Desc(集群) PersonId_UtcTime_Desc TokenId_UtcTime_Desc VehicleId_UtcTime_Desc 当前每个星期(包括索引)占用大约10 GB的数据,并且主数据库中目前大约有300 GB的数据。 主数据库中的数据表具有自己的文件组,其中包含1个文件,但它与主数据库中的所有其他表位于同一磁盘上。辅助数据库位于不同的磁盘上,但位于同一台计算机上。 我认为,当使用新的表分区(一周)时,我们每周还会运行一次索引重建作业。不执行收缩。 该计算机是具有12 GB内存的8核HP,并且包含主数据库的磁盘正在运行RAID 10。 主意 将存储在主数据库中的数据量限制为最多1个月。至少它可以使数据库更易于管理以进行备份/还原,但是通过这样做,我们可以期望看到性能的提高吗? 在文件组中为当前数据创建2个文件,并将它们分发到2个不同的物理分区中 创建保存当前数据的主从数据库,因此在不同数据库上执行插入和读取操作 将当前数据文件放在SSD磁盘上(镜像是否会对SSD磁盘产生任何性能差异?) 请让我知道是否需要更多信息。影响性能的因素很多,并且可能有许多调整方法。

2
数据仓库设计,用于针对多个时区的数据进行报告
我们正在尝试优化数据仓库设计,以支持针对许多时区的数据进行报告。例如,我们可能有一个关于一个月活动的报告(数百万行),该报告需要显示按一天中的小时分组的活动。当然,一天中的那个小时必须是给定时区的“本地”小时。 当我们仅支持UTC和一个本地时间时,我们的设计效果很好。事实表上的UTC和本地时间的日期和时间维度的标准设计。但是,如果我们必须支持100多个时区的报告,则该方法似乎无法扩展。 我们的事实表将变得非常广泛。另外,我们还必须解决SQL中的语法问题,即指定在报告的任何给定运行中使用哪个日期和时间ID进行分组。也许是一个非常大的CASE语句? 我已经看到了一些建议,可以按您覆盖的UTC时间范围获取所有数据,然后将其返回到表示层以转换为本地并在那里进行汇总,但是使用SSRS进行的有限测试表明这将非常慢。 我也参考了一些有关该主题的书籍,它们似乎都说只有UTC并可以进行转换,或者只有UTC和一个本地语言。将不胜感激任何想法和建议。 注意:此问题类似于:在数据集市/仓库中处理时区,但是我无法对此问题发表评论,因此感到这是值得的。 更新:在 Aaron进行了一些重大更新并发布了示例代码和图表之后,我选择了Aaron的答案。我先前对他的答案的评论不再有意义,因为它们涉及答案的原始编辑。如果有必要,我会尝试再次更新此内容

1
存储记录元数据的最佳实践
在数据库中存储单个记录的元数据的最佳实践是什么? 我需要在数据库中存储常见的元数据,例如创建时间和最后更新时间。我找到了几种不同的解决方案: 将元数据直接存储在表中。 优点: 元数据直接链接到记录 无需联接即可检索元数据 缺点: 需要大量重复的列(除非使用继承) 元数据和业务数据不分开 使用创建通用元数据表,并使用软外键将数据链接到正确的表和记录。 优点: 没有重复的列 元数据与业务数据分开 缺点: 元数据和数据之间没有直接链接(不能使用FK) 加入需要附加条件 为每个需要元数据的表创建单独的元数据表。 优点: 元数据直接链接到记录 元数据与业务数据分开 缺点: 需要很多额外的表 需要大量重复的列(除非使用继承) 是否有比我在这里提到的更多的优缺点?存储此元数据的最佳实践是什么?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.