Questions tagged «database-design»

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

2
我应该添加传递式外键吗?
一个简单的例子:有一张客户表。 create table Customers ( id integer, constraint CustomersPK primary key (id) ) 数据库中的所有其他数据都应链接到Customer,因此例如Orders: create table Orders ( id integer, customer integer, constraint OrdersPK primary key (customer, id), constraint OrdersFKCustomers foreign key (customer) references Customers (id) ) 假设现在有一个表链接到Orders: create table Items ( id integer, customer integer, order integer, constraint ItemsPK …

1
时间有效性和主/外键关系
我通读了一些有关时间有效性和时间特性的oracle教程。但是,在我阅读的示例中,演示表中没有使用主键。 http://docs.oracle.com/cd/E16655_01/appdev.121/e17620/adfns_design.htm#ADFNS1005 http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/ilm /temporal/temporal.html 是否应将主键添加到这些表?我之所以问是因为我想知道另一个表应该如何引用这些临时表之一。我可以将外键从一个时态表添加到另一个时态表吗? 如果我添加一个pk /外键关系,然后用pk更新表中的引用,则带有fk的表指向不再相关的记录.... 时间数据是否破坏了常规主键-外键关系?如果是这样,这对性能有何影响,我是否只将普通列用作“外键”并在查询中为参考时间段选择正确的列? 是否有人知道或有任何示例或教程可以轻松地显示具有正常或伪正常pk / fk用法的时间数据? 谢谢

1
如何关联同一表中的两行
我有一个表,行可以相互关联,从逻辑上讲,两行之间的关系是双向的(基本上是无方向的)。(并且,如果您想知道,是的,这确实应该是一张表。这是逻辑实体/类型完全相同的两件事。)我可以想到几种方法来表示: 存储关系及其反向 以一种方式存储关系,以另一种方式限制数据库存储,并具有两个索引,它们的FK顺序相反(一个索引是PK索引) 以两种方式以一种方式存储关系,并允许以任何方式插入第二种方式(听起来有点讨厌,但是完整性) 创建某种分组表,并在原始表上添加一个FK。(提出了很多问题。分组表只能有一个数字;为什么还要有该表?使FK为NULL还是将具有单行的组关联起来?) 这些方式的主要利弊是什么,当然,有什么我没想到的方式吗? 这是一个可使用的SQLFiddle:http ://sqlfiddle.com/#!12/7ee1a/1/0 。(由于这是我正在使用的,所以它是PostgreSQL,但我认为这个问题不是非常特定于PostgreSQL的。)作为示例,它当前存储了关系及其反向关系。

3
RESTful API的SQL数据库结构
我正在创建一个RESTful API。我正在努力决定围绕我的资源设计数据库表的最佳方法。 最初,尽管每个资源一个表都是一个不错的方法,但是现在我担心这会导致在资源链越远的地方,表成指数增长。 例如,假设我有三个资源-用户,客户,销售。用户是我api的订阅者,客户是用户客户,销售是每个客户对用户帐户的购买。 如下访问销售资源 GET /users/{userID}/clients/{clientID}/sales/{salesID} 因此,如果有10个用户,每个用户有10个客户,并且每个客户有10个销售量,那么随着我们走的资源链越远,表的大小就越大。 我相当有信心SQL可以应付大表,但是我不确定读写会如何减慢速度。上面的示例可能没有说明,但是我的api会在我们走的资源链中越来越多地进行更多的写入和读取。因此,在这种情况下,数据库中最大的表的读取和写入次数要比较小的表更多。 在运行查询之前,也有必要联接表。原因是我允许每个用户拥有一个具有相同名称的客户端。为避免获取错误的客户端数据,{userID}将users表和clients表连接在一起。销售情况也是如此。联接大表并运行会进一步降低读写速度吗?

4
父类别/子类别决定类别之间:完全不相交或不完全重叠
我正在建立一个库存数据库,用于存储IT硬件,例如台式计算机,笔记本电脑,交换机,路由器,移动电话等。被放入子类型表中。我的困境是在以下两种设计之间进行选择: 在顶视图中,所有设备共享相同的子类型。例如,台式计算机和便携式计算机将在下表中记录:设备,网络设备。交换机将在以下位置记录:设备,网络设备。路由器将在以下位置记录:设备,网络设备,WANDevice。我们跟踪位置的任何设备都会在“位置”中有一条记录。我在此设置中想到的一些利弊: 优点:基于公共字段(例如主机名或LocationID)选择记录更加容易。 优点:没有空字段。 缺点:特定设备的CRUD操作中应包含的表并不明显,并且可能会使以后的DBA感到困惑。 在底图中,所有设备都有其自己的子类型(此处未显示更多类的设备)。在这种情况下,很明显哪些表记录被插入或选择。台式计算机和便携式计算机可以在“计算机”等中使用。对于此设置,我想到了一些利弊: 优点:很明显,哪些表用于子类型的CRUD操作。 优点:CRUD操作只需使用一张表。 缺点:基于公共子类型字段选择记录需要合并所有表,例如,按主机名或LocationID进行搜索。 在这两种情况下,ClassDiscriminator字段都放在子类型表中,以与CHECK约束一起使用,以控制可以插入哪些类型。 是否有任何建议的设计更好,还是完全出于见解并取决于数据库的预期目的? 编辑:我有一个特定的问题有关表“ NetworkDevice”的重叠性质。该表用于保存具有主机名和/或IP地址的任何设备的网络信息,无论它是计算机,交换机还是路由器。该表的重叠性质是否会引起问题,还是可以通过这种方式实现? 预先感谢您提供任何输入。请询问是否需要其他信息。

2
在Cassandra中使用成千上万的列族或键空间会受到哪些惩罚?
我正在评估Cassandra安装的最佳设计。 Internet上关于使用Cassandra提供的前两个访问级别(键空间和列族)的信息并不多。 我想知道如果您选择创建大量的键空间或列族(大于10.000),将受到什么惩罚? 某处的旧博客文章建议Cassandra为每个列族保留内存。本文是关于0.6版本的,当前版本是1.0。还是这样,还是一个真正的问题? 在Cassandra中使用成千上万的列族或键空间会受到哪些惩罚?

1
生成发票和跟踪
系统每2周就会为公司生成发票。 公司将在每月的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 | +----+-----------+ 客户可以从我的网站选择一家公司。 订单表 mysql> select * from orders; +----+---------+------------+------------+---------------------+-----------+ | id …

2
使用单独的架构如何影响SQL Server 2008的性能?
我想在SQL Server 2008数据库中为具有不同目的的对象使用单独的架构。现在,我们使用一种令人费解的命名约定来表示表或存储过程的目的,并且前缀意味着我们必须扫描五个或六个xharacter才能看到唯一名称的开头。我想为仅用于驱动UI的表(菜单,人员角色等)和维表与事实表等使用单独的架构。 我的问题是,使用多种架构(方案?)会对所有事情都使用旧的dbo产生性能影响吗?

3
魔术列“名称”从何而来?
我是偶然得到的: db=> select name from site; ERROR: column "name" does not exist LINE 1: select name from site; ^ db=> select site.name from site; name --------------- (1,mysitename) (1 row) 第二个查询返回一个包含整行的元组。使用Postgres 9.0.1。 编辑:按要求定义站点。我并不重要,这个怪癖适用于任何桌子。 db=> \d site Table "public.site" Column | Type | Modifiers --------+---------+--------------------------------------------------- id | integer | not null default …

2
如何将数据库/表实现为堆栈
我有一个状态机,需要为不同的用户推送/弹出一些文件名。传统上,我将使用堆栈作为数据结构的选择,但这需要使用数据库来完成,因为我没有办法在传入的Web请求之间保留数据结构。 我想知道使用数据库实现堆栈功能的好方法是什么? 我需要支持: push(fileName,user):为用户推送一个文件名 pop(user):弹出用户最上面的文件名 编辑: 我正在制作一个原型的原型,因此我将sqlite3与python一起使用。 谢谢!

1
何时在DynamoDB中使用多个表?
DyanmoDB 最佳实践明确表明: 您应在DynamoDB应用程序中维护尽可能少的表。设计良好的大多数应用程序只需要一张桌子。 我发现这很有趣,因为我所见过的每一个有关DyanmoDB的教程都具有多表设计。 但是,这实际上意味着什么? 让我们考虑一个具有三个主要实体的简单应用程序:用户,项目和文档。一个用户拥有多个项目,一个项目可以有多个文档。我们通常必须在用户的项目和项目的文档上进行查询。读取数量多于写入数量。 天真的教程的表设计将使用三个表: Users Hash key user-id Projects Hash key Global Index project-id user-id Documents Hash key Global Index document-id project-id 我们可以很容易崩溃Project,并Document为一个Documents表: Documents Hash key Sort key Global Index project-id document-id user-id 但是为什么要停在那里?为什么不用一张桌子来统治他们呢?既然User是一切的根源... Users Hash key Sort key user-id aspect --------- --------- foo user email: foo@bar.com …

6
将多个值存储在一行的一个字段中而不是单独存储的可能的好处
在我们上一次的每周会议上,一个没有数据库管理经验的人提出了以下问题: “是否有一种场景可以证明以行(字符串)而不是几行的形式存储数据?” 让我们假设有一个表countryStates,我们要在其中存储一个国家的州。在本示例中,我将使用USA,并且为了懒惰,不会列出所有州。 在那里,我们将有两列;一个被称为Country,另一个被称为States。作为讨论在这里,并通过@ srutzky提出的答案时,PK会通过定义的代码ISO 3166-1阿尔法-3。 我们的表如下所示: +---------+-----------------------+-------------------------------------------------------+ | Country | States | StateName | +---------+-----------------------+-------------------------------------------------------+ | USA | AL, CA, FL,OH, NY, WY | Alabama, California, Florida, Ohio, New York, Wyoming | +---------+-----------------------+-------------------------------------------------------+ 当向朋友开发人员询问相同的问题时,他说,从数据流量大小的角度来看,这可能很有用,但是如果我们需要操纵这些数据则没有用。在这种情况下,必须在应用程序代码上具有智能,该智能可以转换列表中的此字符串(假设可以访问此表的软件需要创建一个组合框)。 我们得出的结论是,该模型不是很有用,但是我怀疑可能有一种使之有用的方法。 我想问的是,你们中是否有人已经以一种切实有效的方式看到,听到或做过类似的事情。

2
我应该使用UUID还是ID
我已经在系统中使用UUID一段时间了,原因有很多,从日志记录到延迟的关联。随着我变得越来越幼稚,我使用的格式发生了变化: VARCHAR(255) VARCHAR(36) CHAR(36) BINARY(16) 当我到达最后一个时BINARY(16),我开始将性能与基本自动递增整数进行比较。测试和结果如下所示,但如果你只是想总结,表示INT AUTOINCREMENT和BINARY(16) RANDOM对数据相同的性能范围高达20万(该数据库已预先填充之前测试)。 最初,我对将UUID用作主键持怀疑态度,确实确实如此,但是我发现这里有潜力创建一个可以同时使用两者的灵活数据库。尽管许多人强调这两种方法的优点,但同时使用这两种数据类型可以消除哪些缺点呢? PRIMARY INT UNIQUE BINARY(16) 这种类型的设置的用例将是表间关系的传统主键,并且具有用于系统间关系的唯一标识符。 我本质上试图发现的是两种方法之间的效率差异。除了所使用的四倍磁盘空间(在添加其他数据后可能几乎可以忽略不计)外,在我看来它们是相同的。 架构: -- phpMyAdmin SQL Dump -- version 4.0.10deb1 -- http://www.phpmyadmin.net -- -- Host: localhost -- Generation Time: Sep 22, 2015 at 10:54 AM -- Server version: 5.5.44-0ubuntu0.14.04.1 -- PHP Version: 5.5.29-1+deb.sury.org~trusty+3 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; …

1
将可为空的列添加到表的时间超过10分钟
我在表上添加新列时遇到问题。 我尝试运行几次,但是运行了十多分钟后,由于锁定时间,我决定取消查询。 ALTER TABLE mytable ADD mycolumn VARCHAR(50); 有用的信息: PostgreSQL版本:9.1 行数:〜250K 列数:38 可为空的列数:32 约束数量:5(1 PK,3 FK,1 UNIQUE) 索引数:1 操作系统类型:Debian Squeeze 64 我发现了有关PostgreSQL管理可空列的方式的有趣信息(通过HeapTupleHeader)。 我的第一个猜测是,因为此表已经具有8位的32个可空列MAXALIGN,所以HeapTupleHeader的长度为4个字节(未经验证,我不知道该怎么做)。 因此,添加新的可为空的列可能需要在每行上更新HeapTupleHeader以添加新的8位MAXALIGN,这可能会导致性能问题。 因此,我尝试更改可为空的列之一(实际上并不是真正可为空的),以便将可为空的列的数量减少到31,以检查我的猜测是否正确。 ALTER TABLE mytable ALTER myothercolumn SET NOT NULL; 不幸的是,这种更改也需要很长时间,超过5分钟,因此我也中止了它。 您是否知道会导致这种性能损失的原因?

3
在SQL中实现一对零或一个关系
让我们说,我正在为存在一对零或一个(1-0..1)关系的场景设计数据库。例如: 有一组用户,有些 用户也可能是客户。 因此,我创建了两个对应的表,users和customers,但是…… …在给定的SQL平台上表示和实现这种情况的最佳方法是什么?我考虑了两种可能的解决方案: 在users表中,添加customer可能是FOREIGN KEY引用customers或NULL标记的列。 在customers表格中,包括指向表格的user列(设置了UNIQUE约束)users。 我已经在一些论坛中提出过类似的问题,但是答案基本上是“无论您需要什么”,“无论您认为方便什么”。我不喜欢这种答案。我想要一个严肃的DB理论,一个有充分根据的答案。我在哪里可以阅读有关1-0..1关系的信息?

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.