Questions tagged «database-design»

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

4
一个大数据库与几个小数据库
我们有一种情况,我们可以(A)使用表前缀在一个MySQL数据库中部署应用程序实例,或者(B)对应用程序的每个实例使用不同的MySQL数据库,例如, 设置“ A”: central_database app1_table1 app1_table2 app1_tablen ... appn_table1 appn_table2 appn_tablen 最终结果是具有许多表的大型数据库。 设置“ B”: app1_db table1 table2 tablen ... appn_db table1 table2 tablen 最终结果是许多数据库带有某些表。 在所有条件都相同的情况下(例如,数据量,应用程序实例数等),采用这两种方法的利弊是什么?什么会对数据库性能和维护造成不利影响?该应用程序基于PHP 5,可在Apache 2.x上运行,而我们正在运行MySQL5.x。 非常感谢您的时间和想法!

5
在MySQL中将单列与多个值匹配而不使用自联接表
我们有一个表,用于存储问题的答案。我们需要能够找到对特定问题有特定答案的用户。因此,如果我们的表包含以下数据: user_id question_id answer_value Sally 1 Pooch Sally 2 Peach John 1 Pooch John 2 Duke 并且我们想找到对问题1回答“ Pooch”而对问题2回答“ Peach”的用户,则以下SQL(显然)不会起作用: select user_id from answers where question_id=1 and answer_value = 'Pooch' and question_id=2 and answer_value='Peach' 我的第一个想法是针对需要的每个答案自行加入表格: select a.user_id from answers a, answers b where a.user_id = b.user_id and a.question_id=1 and a.answer_value = …

1
产品捆绑在一起的产品的数据库设计
我正在为零售业务建立数据库系统。我设置了一些表,它们是: 产品 采购 营业额 平衡 所有这些相互连接,并且能够显示我的库存水平。 我遇到的问题是我还销售捆绑销售的产品-价格与单个产品价格不同。 示例:我以1美元的价格出售一个橙子,以1.2美元的价格出售一个苹果;我以3.8美元的价格出售水果套餐1(2个橙子和2个苹果),以7美元的价格出售水果2包(4个橙子和4个苹果)。 有没有正确的方法来为这些产品捆绑创建关系? PS:我正在使用FileMaker Pro创建它。

2
数据库设计:规范“(多对多)对多”关系
精简版 我必须在现有的多对多连接中为每对添加固定数量的其他属性。跳到下图,就优点和缺点而言,选项1-4中的哪一种是通过扩展基本案例来实现此目的的最佳方法?或者,还有没有在这里我没有考虑过的更好的选择? 较长的版本 我目前有一个通过中间联接表以多对多关系的两个表。现在,我需要向属于这对现有对象的属性添加其他链接。尽管属性表中的一个条目可能适用于多个对(或者甚至可以成对使用多次),但每个对都有固定数量的这些属性。我正在尝试确定执行此操作的最佳方法,并且在梳理如何思考情况时遇到了麻烦。从语义上来说,我似乎可以很好地描述以下任何一种情况: 一对链接到一组固定数量的其他属性 一对链接到许多其他属性 许多(两个)对象链接到一组属性 许多对象链接到许多属性 例 我有两个对象类型,X和Y,每个都有唯一的ID,以及一个objx_objy带有列x_id和的链接表y_id,它们一起构成链接的主键。每个X可以与许多Y相关,反之亦然。这是我现有的多对多关系的设置。 基本情况 现在,我另外在另一个表中定义了一组属性,以及一组条件,在这些条件下,给定(X,Y)对应该具有属性P。条件的数量是固定的,所有对都相同。他们基本上说:“在情况C1中,对(X1,Y1)具有属性P1”,“在情况C2中,对(X1,Y1)对具有属性P2”,依此类推,对于联接中每对的三种情况/条件表。 选项1 在我目前的状况正好有三个这样的条件,我也没有理由认为增加,所以一种可能性是添加列c1_p_id,c2_p_id以及c3_p_id对featx_featy,指定用于给定x_id和y_id,其性能p_id在每个三种情况使用。 在我看来,这并不是一个好主意,因为它使SQL难以选择应用于某个功能的所有属性,并且无法轻松扩展到更多条件。但是,它确实对(X,Y)对执行一定数量的条件的要求。实际上,这是这样做的唯一选择。 选项2 创建一个条件表cond,并将条件ID添加到联接表的主键中。 不利的一面是,它没有为每对指定条件数量。另一个是当我只考虑初始关系时,例如 SELECT objx.*, objy.* FROM objx INNER JOIN objx_objy ON objx_objy.x_id = objx.id INNER JOIN objy ON objy.id = objx_objy.y_id 然后,我必须添加一个DISTINCT子句以避免重复的条目。这似乎已经失去了每个对应该只存在一次的事实。 选项3 在联接表中创建一个新的“对ID”,然后在第一个与属性和条件之间建立第二个链接表。 除了缺乏对每对执行固定数量的条件外,这似乎具有最少的缺点。创建一个除了现有ID之外没有其他标识的新ID是否有意义? 选项4(3b) 与选项3基本相同,但不创建其他ID字段。这是通过将两个原始ID都放入新的联接表中来完成的,因此它包含x_id和y_id字段,而不是xy_id。 这种形式的另一个优点是它不会更改现有表(尽管它们尚未投入生产)。但是,它基本上多次复制整个表(或者无论如何感觉都是这样),因此似乎也不理想。 摘要 我的感觉是,选项3和4足够相似,我可以选择其中一个。如果不要求对属性进行少量固定的链接,那么到现在我可能已经有了,这使得选项1看起来比其他情况更加合理。根据一些非常有限的测试,DISTINCT在这种情况下向我的查询添加一个子句似乎不会影响性能,但是我不确定选项2和其他情况是否都代表了这种情况,因为放置会引起内在的重复链接表的多行中的相同(X,Y)对。 这些选择是我最好的前进方式,还是我应该考虑另一种结构?

5
在数据库中共享一个主键序列?
将单个序列用作所有表的主键是否可以接受(不是主键对于给定表是唯一的,而是所有表都是唯一的)?如果是这样,从客观上讲,它比在表中使用单个主键序列更好。 我是一名初级软件开发人员,而不是DBA,因此我仍在学习良好数据库设计的许多基础知识。 编辑:如果有人想知道的话,我最近读了我们公司的一名DBA对数据库设计的评论,他提到了一个问题,即设计没有在整个数据库中使用单个主键,这听起来与事实不同。到目前为止,我已经学到了。 Edit2:要回答注释中的问题,这是针对Oracle 11g的,但是我想知道的是非数据库特定级别。如果这个问题确实取决于数据库,我很想知道为什么,但是在这种情况下,我将寻找针对Oracle的答案。

3
外键-使用代理键还是自然键链接?
对于表之间的外键应该链接到自然键还是代理键,是否存在最佳实践?我真正发现的唯一讨论(除非缺少我的google-fu)是杰克·道格拉斯在这个问题上的答案,他的推理对我来说似乎很合理。我知道有关规则会发生变化的讨论之外,但是在任何情况下都需要考虑这一点。 提出这个问题的主要原因是,我有一个使用带有自然键的FK的遗留应用程序,但是开发者大力推动将其移至OR / M(在我们的例子中为NHibernate),并且一个fork已经产生了一些东西。中断更改,因此我希望使用自然键将它们推回正轨,或者移动旧版应用程序以使用FK的替代键。我的直觉说要恢复原始的FK,但是老实说,我不确定这是否是正确的选择。 我们的大多数表都已经定义了代理键和自然键(尽管有唯一约束和PK),因此在这种情况下,不必添加额外的列对我们来说不是问题。我们正在使用SQL Server 2008,但是我希望这对于任何数据库都足够通用。

4
如何为两个表的MySQL建模
我有一些表用于存储数据,并取决于完成工作的人的类型(工人,民事人员),我想将其存储在event表中,现在这些人抢救出了一只动物(有一个animal表)。 最后,我想有一张桌子来存储一个人(工人,土木工人)救了一只动物的事件,但是弓箭我应该添加一个外键或者如何知道id完成这项工作的土木工人或工人的价值? 现在,在这种设计中,如果我只有一个人(又称民事人员),我不知道如何关联哪个人做这项工作,我只会将这个civil_id谷值存储person在最后一张表中的列中……但是如何知道是土木还是工人,我是否需要其他“中级​​”表? 如何在MySQL中反映下图的设计? 额外细节 我通过以下方式对其进行建模: DROP TABLE IF EXISTS `tbl_animal`; CREATE TABLE `tbl_animal` ( id_animal INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(25) NOT NULL DEFAULT "no name", specie VARCHAR(10) NOT NULL DEFAULT "Other", sex CHAR(1) NOT NULL DEFAULT "M", size VARCHAR(10) NOT NULL DEFAULT "Mini", edad VARCHAR(10) NOT …

2
对子集聚合建模约束?
我使用的是PostgreSQL,但我认为大多数高端数据库必须具有一些类似的功能,而且,针对它们的解决方案可能会为我带来灵感,因此,请不要考虑此特定于PostgreSQL。 我知道我不是第一个尝试解决此问题的人,因此我认为这里值得一问,但我正在尝试评估建模会计数据的成本,以便使每笔交易都达到基本平衡。会计数据是仅追加的。这里的总体约束(用伪代码编写)可能大致类似于: CREATE TABLE journal_entry ( id bigserial not null unique, --artificial candidate key journal_type_id int references journal_type(id), reference text, -- source document identifier, unique per journal date_posted date not null, PRIMARY KEY (journal_type_id, reference) ); CREATE TABLE journal_line ( entry_id bigint references journal_entry(id), account_id int not null references account(id), …

5
使用多个数据库与使用单个数据库的利弊
我正在一个新项目中工作,该项目要求使用7个数据库,并认为更容易实现性能,稳定性和优化。 虽然我不同意,但我在收集好的参数以使用单个数据库时遇到了麻烦(将表拆分为逻辑域)。 到目前为止,我有一个论点是数据完整性(我不能在数据库之间使用外键)。 使用单个或多个数据库有哪些优点/缺点? [到目前为止的总结] 针对多个数据库的参数: 丢失数据完整性(不能在数据库上使用外键) 失去还原完整性 获得复杂性(数据库用户/角色) 小赔率服务器/数据库将关闭 解决方案: 使用架构来分隔域。 POC:使用伪数据证明7/1 db执行计划中的重点

3
用户数据库是否有标准实现?
我需要为我的网站实现基本的个性化用户功能。这种类型的数据库是否有标准结构?就像将所有用户信息和数据都放在一个表中,每个用户都有自己的行是一种常见的做法,还是应该将此信息拆分到不同的表中并链接在一起(也许是为了提高效率?),我不太关心安全性在这一点上,但我显然希望过早地进行密码加密。 我试图找到我在Google上想要的东西,但无济于事。请让我知道问题是否需要进一步澄清。

2
数据库引擎到底是什么?
我已经仔细阅读了http://en.wikipedia.org/wiki/Database_engine上的定义: 数据库引擎(或“存储引擎”)是数据库管理系统(DBMS)用于从数据库创建,读取,更新和删除(CRUD)数据的基础软件组件。 我不明白的是剩下要做的事情,难道不是CRUD数据库所能做的全部吗? 如果数据库引擎执行这些功能,那么数据库的其余部分会做什么?

2
复合主键是一个坏习惯吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 我想知道复合主键是否是一种不好的做法,如果不是,则建议在哪种情况下使用。 我的问题是基于这篇文章 关于复合主键的部分: 错误做法6:复合主键 这是一个有争议的观点,因为当今许多数据库设计人员都在谈论使用整数ID自动生成的字段作为主键,而不是使用由两个或多个字段的组合定义的复合键。目前,这被定义为“最佳实践”,就我个人而言,我倾向于对此表示赞同。 但是,这只是一个约定,当然,DBE允许定义复合主键,许多设计人员认为这是不可避免的。因此,与冗余一样,复合主键是设计决策。 但是请注意,如果带有复合主键的表预期有数百万行,则控制复合键的索引可能会增长到CRUD操作性能大大下降的地步。在那种情况下,最好使用一个简单的整数ID主键,其索引将足够紧凑,并建立必要的DBE约束以保持唯一性。

5
电子商务订单表。节省价格,还是使用审核/历史记录表?
我正在设计我的第一个电子商务模式。我已经阅读了一段时间,对an order_line_item和a 之间的关系有些困惑product 一个product可以被购买。它具有各种细节,但最重要的是unit_price。 在客户购买产品时,An order_line_item具有product_id购买,quantity购买和购买时的外键unit_price。 我读过的大部分内容都说unit_price上的order_line_item应该显式添加(即,不通过引用product_id)。这是有道理的,因为商店将来可能会更改价格,这会弄乱订单报告,跟踪,完整性等。 我不明白的是,为什么直接将unit_price值保存到order_line_item? 创建记录unit_price变更记录的审计/历史记录表会更好product吗? order_line_item创建an时,将product_audit添加表的外键,并可以从此处检索价格(通过引用)。 在我看来,使用这种方法有很多好处(减少数据重复,更改价格历史记录等),那么为什么不更频繁地使用它呢?我没有遇到使用这种方法的电子商务模式的示例,我错过了什么吗? UDPATE:看来我的问题与尺寸变化缓慢有关。我仍然很困惑,因为“缓慢变化的维度”与数据仓库和OLAP有关。那么,是否可以将“缓慢更改维度”类型应用于我的主要业务交易流程数据库(OLTP)?我想知道我是否将很多概念混在一起,将不胜感激一些指导。

2
设计模式-许多父表之一
我经常遇到数据库中的一种情况,其中给定的表可以FK到许多不同的父表之一。我已经看到了解决该问题的两种解决方案,但都不令人满意。我很好奇,您在那里看到过其他哪些模式?有更好的方法吗? 一个人为的例子 假设我的系统有Alerts。可以接收各种对象的警报-客户,新闻和产品。给定的警报可以仅针对一项。无论出于何种原因,客户,商品和产品都在快速移动(或本地化),因此在创建警报时无法将必要的文本/数据提取到警报中。有了这种设置,我已经看到了两种解决方案。 注意:以下DDL用于SQL Server,但我的问题应适用于任何DBMS。 解决方案1-多个可空FKey 在此解决方案中,链接到多个表的表具有多个FK列(为简便起见,下面的DDL不显示FK创建)。 好的 -在这种解决方案中,很高兴我有外键。FK的零光学特性使添加精确数据变得非常方便且相对容易。BAD查询不是很好,因为它需要N个 LEFT JOINS或N个 UNION语句来获取关联的数据。在SQL Server中,特别是LEFT JOINS会阻止创建索引视图。 CREATE TABLE Product ( ProductID int identity(1,1) not null, CreateUTC datetime2(7) not null, Name varchar(100) not null CONSTRAINT PK_Product Primary Key CLUSTERED (ProductID) ) CREATE TABLE Customer ( CustomerID int identity(1,1) not null, CreateUTC datetime2(7) not …

3
在SQL Server的表上具有多个可为空的FK是否被视为一种不好的做法
在SQL Server的数据库结构中,我有3种类型的产品,它们需要有关订单的不同信息。所以,我创建了一个Customers桌子,三个不同的顺序表:OrdersForProductAs,OrdersForProductBs,OrdersForProductCs。所有订单表在表上都有一对多的关系Customers。 我还有另一个表格,Payments里面将保存付款明细。但是我在这里对如何组织感到怀疑。 因为我有多种产品类型,并且一个客户可能同时具有多个产品的订单,所以我需要将这三个订单表与Payments表相关联。 另一个问题是,客户只能订购一种产品。因此,表上的FK列Payments需要为nullable。 我的问题是nullable,从长远来看,那些FK色谱柱是否会让我头疼?一般来说,在表上具有可空的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.