标签: database-design

如何实现最大属性数未知的实体?

我正在设计一个棒球模拟程序,但在设计 boxscore 模式时遇到了问题。我的问题是我想跟踪每局得分的次数。我在实际程序中这样做的方法是使用一个动态数组,该数组随着每局比赛而增长。

对于那些不熟悉棒球比赛的人来说,比赛通常是九局,除非比赛在第 9 局结束时仍然打平。因此,棒球比赛的长度不确定,这意味着我不能将数据库设计为每局得分只有 9 列(技术上是 18(9 局 * 2 队)。我的一个想法是序列化数组并将其编码为 Base64,然后再将其存储在数据库中。但是,我不知道这是否是一种很好的技术,我想知道是否有人有更好的主意。

如果重要,我正在开发的数据库是 PostgreSQL。

任何建议都非常感谢!谢谢!

schema postgresql database-design

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

多少存储过程参数太多了?

我刚刚开始在 SQL Server 2008 中编写存储过程,并且有 30 多个参数。我从来没有写过一个参数超过 10 个的,这让我开始思考……什么时候参数太多了?

对于背景...这个程序基本上将INSERT单列成一个单一的表。也会有一个非常相似的;虽然有点小;在同一个表上执行UPDATE 的版本。大多数列相对较小,混合了 int 和 string (varchar(200) )。

有哪些问题;是好是坏; 有一个包含大量参数的程序,我应该开始考虑其他模式的阈值是多少?

performance sql-server-2008 database-design optimization

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

生成发票和跟踪

每两周,系统将为公司生成发票。

公司将在每月 1 日和 16 日收到发票。(它将每 2 周通过 Cron Job 运行一次。它会扫描订单表,然后添加到“发票”表中。还有其他选择吗?)

表中有客户订单列表,orders还标明了它属于哪个公司(orders.company_id

invoice表计算orders表中订单的总成本。

我想弄清楚如何设计合理的发票跟踪。有时公司将不得不向我发送费用或有时我向他们发送费用 ( invoice.amount)

我需要使用以下内容跟踪发票:

  • 当公司向我发送金额时
  • 我什么时候把钱寄给公司的
  • 从公司收到了多少金额
  • 我给公司寄了多少钱
  • 我是否收到了全额(如果没有,我需要在 Db 上更新什么?)
  • 发票状态(发票已发送、已取消、已收到金额、已发送金额)

这是我提出的数据库设计:

公司表

mysql> select * from company;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Company A |
|  2 | Company B |
+----+-----------+
Run Code Online (Sandbox Code Playgroud)

Customers can select a company from my website.

orders table

mysql> select * from orders;
+----+---------+------------+------------+---------------------+-----------+
| id | …
Run Code Online (Sandbox Code Playgroud)

mysql normalization database-design transaction

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

如何在没有表的数据库中存储数据?

我在学校学到的只是将数据保存到表中的 SQL。现在我正在研究一个数据存储在 XML 文件中的项目。此外,每个 XML 都包含对可视文件 (JPEG) 的引用。

XML 本身包含一千多个坐标点,以及有关数据的附加信息。

在我看来,将这些信息存储在表格中是没有意义的。此外,我也无法使用 SQL 存储 JPEG 文件。

什么是合适的解决方案,或者我这边的推理是否有错误?

如您所见,我对数据库很陌生。因此,欢迎任何建设性的建议、链接和建议。

xml database-design

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

一对一关系正常化了吗?

考虑我们有大量的统计数据作为记录;例如 20-30INT列。将整个集合保存在一个表中是否更好,因为它们都属于一个记录或创建另一个以一对一关系连接的表。

前者的优点是避免JOIN并快速访问相应记录的所有统计数据。

后者的优点是保持柱子整洁。第一列是读密集型,第二列是写密集型。当然,我认为它对性能没有显着影响,因为我使用的是行级阻塞的 InnoDB。

一般来说,我想知道为单个记录分离不同的数据集是否实用?

mysql innodb normalization database-design relational-theory

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

类别之间的超类型/子类型决定:完全不相交或不完全重叠

我正在构建一个库存数据库,用于存储 IT 硬件,例如台式计算机、笔记本电脑、交换机、路由器、手机等。我正在使用超类型/子类型模式,其中所有设备都存储在一个表中,以及特定信息被放入子类型表中。我的困境是在以下两种设计之间进行选择:

在此处输入图片说明

在上图中,所有设备共享公共子类型。例如,台式计算机和膝上型计算机将在下表中具有记录:Device、NetworkDevice。交换机将在以下位置记录:设备、网络设备。路由器将在以下位置记录:Device、NetworkDevice、WANDevice。我们跟踪位置的任何设备都将在位置记录。我认为此设置的一些优点和缺点:

  • 优点:基于通用字段(如主机名或位置 ID)选择记录更容易。
  • 优点:没有空字段。
  • 缺点:应包含在特定设备的 CRUD 操作中的表并不明显,可能会混淆未来的 DBA。

在底部图表中,所有设备都有自己的子类型(此处未显示更多设备类别)。在这种情况下,很明显哪些表记录被插入或从中选择。台式电脑和笔记本电脑进入电脑等。我认为这个设置的一些优点和缺点:

  • 优点:对于子类型的 CRUD 操作使用哪些表是显而易见的。
  • 优点:只需使用一张表进行 CRUD 操作。
  • 缺点:根据公共子类型字段选择记录需要组合所有表,例如按主机名或位置 ID 搜索。

在这两种情况下,ClassDiscriminator 字段都放置在子类型表中,与 CHECK 约束一起使用以控制可以插入的类型。

是否有关于哪种设计更好的建议,或者这完全是意见问题并取决于数据库的预期目的?

编辑:我有一个关于“NetworkDevice”表的重叠性质的具体问题。该表旨在保存具有主机名和/或 IP 地址的任何设备的网络信息,无论是计算机、交换机还是路由器。该表的重叠性质是否会导致问题,或者以这种方式实现它是否可以?

预先感谢您提供的任何意见。请询问是否需要任何其他信息。

database-design subtypes

12
推荐指数
1
解决办法
3万
查看次数

在 Oracle 中不使用可为空数字的原因?

我们公司正在与另一家软件公司进行联合项目的接口,我们被告知,如果不应该显示特定值,我们应该传入 -5000(他们的任意标记值);原因是他们的 Oracle 数据库中没有数字列支持空值,这是根据他们(现在是前任)Oracle 开发人员的建议。这家公司还在 VB6 中编写了绝大多数代码(慢慢过渡到 VB.NET,这是另一天的另一个话题......)。出于纯粹的好奇,这个推荐有什么正当理由吗?我想不出任何站在我这边的人。

- - 编辑

感谢大家的反馈。我在 CodeProject.com(链接)上提出了同样的问题,并收到了非常相似的反馈。似乎唯一一次可以开始证明这种做法是与外键有关的,我可以声明它们在系统中的任何地方都没有使用外键。做出此决定的开发人员(我曾经在该公司工作)的经验比我多得多,因此我想确保在遭到嘲笑之前没有正当理由。

null oracle database-design

12
推荐指数
4
解决办法
3676
查看次数

用于“已归档但可用”数据的 SQL Server 数据库设计

我们有这个打算“缩小”的大型数据库(> 1TB)。数据库围绕一个主要实体,我们称之为“访问”。为了讨论,假设它是一个医疗实践的数据库。

共有30个访问“类型”,例如程序、年度、随访、免疫等,每个访问“类型”都是“访问”的子表,例如“visit_immuno”。

该数据库自 2000 年以来已经积累了大约 12 年的数据。有人建议我们将大约 3 年的数据保留在“实时”版本中,而将其余的数据保留在“旧数据”数据库中。日期仅存储在“访问”表中,因为它是标准化的。Visit 表还包含一个ROWVERSION列和一个BIGINT伪标识(集群)列。出于所有意图和目的,假设集群键由 SEQUENCE (SQL Server 2012 Enterprise) 填充 - 我们将其命名为cid

visit.date当医生的推移延长探视,并与他的数据的“公文包”的回报并不总是以相同的顺序作为聚集键,例如,它被合并到主表。“访问”表也有一些更新,这将导致ROWVERSION列与ciddate列不同步- 简单地说,由于这个原因,ROWVERSIONcid不会制作合适的分区键。

从“实时”中删除数据的业务规则是visit.date必须大于 36 个月并且visit_payment必须存在子记录。此外,“old_data”数据库不包含任何基表,除了visit%.

所以我们最终得到:

直播DB(日常使用) -所有表老数据DB -对于较旧的数据visit%

该提案要求一个组合数据库,它是一个外壳,其中包含(除外)中所有基表的同义词以及跨两个数据库中的表联合所有的视图Live DBvisit%visit%

假设在Old-Data数据库中创建了相同的索引,查询会在 UNION-ALL视图上表现良好吗?什么类型的查询模式可能会影响 UNION-ALL视图的执行计划?

database-design sql-server sql-server-2012

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

过多的空闲连接会影响 PostgreSQL 9.2 的性能吗?

我的数据库服务器上的一些查询似乎需要很长时间才能响应,而且我认为 CPU 使用率很高。运行时ps aux,我看到大约 250 个“空闲”连接(我认为太多了)。我还没有开始做一个完整的诊断,但我想知道这是否是一个开始寻找的好地方。

我还将 PgBouncer 与事务级池一起使用。我怀疑我可以idle通过调整池大小轻松减少连接数。但是,除非有充分的理由,否则我不想开始做太多更改。

idlePostgreSQL 9.2 中的很多连接会影响性能吗?

非常感谢!

postgresql performance database-design query-performance

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

两个可为空的列之一需要具有值

无解释问题:

反正有 2 个空值的约束,总是需要 1 有 value 吗?例如,两个日期列都为空,但至少有1 个需要有值

问题描述:

假设我有一个名为 Expense 的表

并有 2 个日期:

prevision_expense_expiration_date DATE NULLABLE 费用_payment_date DATE NULLABLE

这两列的逻辑如下:

我买了一些东西,我知道我必须为它付款,某个日期,比如电话费。我会将此作为费用输入,并带有费用支付日期。这个日期是我应该付款的假定日期,而不是实际付款日期,例如发票的到期日期。

在其他情况下,我出售某些提供商的礼品卡以获取其服务。当客户兑换卡时,我可能需要向我的提供商购买服务转移给我的客户。因此,礼品卡有一个到期日期,我想为该“费用”做一个预想,而不是在礼品卡有效期内作为费用插入,如果礼品卡过期,则该“费用”不应进入帐户系统。

我知道我可以有 2 个相同的表,称为 prevision_expense 和confirmed_expense,但听起来不对,所以我在同一个表中,2 个日期,可以为空,但我想限制或其他东西,以便始终需要一个。

还有另一种可能的策略:

payment_date 日期非空 is_prevision_date BOOL 非空

因此,在这种情况下,如果日期是 prevision bool 值将为 1,否则将为 0。没有空值,一切都很好。除了我想要在第一次有一个预设日期时存储两个值的选项,然后(让我们说两天后)有该费用的确认日期,在这种情况下,使用策略 2 我将没有该选项。

我在数据库设计中做错了什么吗?:D

mysql null database-design

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