Questions tagged «database-design»

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


1
具有两种可能的所有者/父类型的实体的数据库架构?
我正在将PostgreSQL与Sequelize用作我的ORM。 我有一种类型User。第二种类型是Group,可以通过GroupMemberships表与任何数量的用户相关联。Users也可以拥有任意数量的Groups。 我的第三种类型Playlist可以属于UserOR或a group。为这种类型设计模式的最佳方法是什么,使其既可以具有所有者的一种,又可以具有所有者的任何一种? 我的第一遍创建了两个关联,但是一次只能填充一个。这可能可行,但似乎很麻烦,并且使查询变得困难。 附加信息 这是我对MDCCL通过评论发布的澄清请求的回复: (1)如果一个播放列表是由给定资集团,可以说,这个播放列表是关系到一个一对多的用户,只要他们是会员这样的小组,对不对? 我相信这在技术上是正确的,但是这种一对多的关联并不明确存在。 (2)因此,一个特定的播放列表是否可以同时由一对多的组拥有? 不,Playlist一对多不可能拥有一个Groups。 (3)一个特定的播放列表是否可能由一对多组拥有,同时又由不是该组成员的一对多用户拥有? 没有,因为在(2)一到,许多从Playlist到Group应该不存在。此外,如果a Playlist由a Group拥有,则不由a拥有User,反之亦然。一次仅一个所有者。 (4)用来唯一标识组,用户和播放列表的属性是什么? 它们每个都有代理主键(id)和自然键(尽管不是主键)。这些是slug用于Group和Playlist,username用于User。 (5)能在特定播放列表遭受所有者的变化? 尽管我不打算将其作为一项功能(至少最初是这样),但我认为这可能会发生。 (6)Group.Slug和Playlist.Slug属性的含义是什么?它们的值是否稳定到足以定义为主键,或者它们经常更改?这两个属性的值以及User.Username必须唯一,对吗? 这些slug是各自实体的唯一,小写,带连字符的版本title。例如,group带有title“测试组”的a将具有slug“测试组”。重复项将附加增量整数。每当他们title改变时,这都会改变。我相信这意味着他们不会做出出色的主键吗?是的,slugs并且usernames在各自的表中是唯一的。

2
从文本和图像迁移到varchar(max)和varbinary(max)
我有一个包含许多image和text列的SQL Server数据库,并且我正在研究将它们迁移到未弃用的对varbinary(max)等物和时可能引起的潜在问题varchar(max)。 除了更改应用程序代码外,我主要关心的是与此相关的潜在“陷阱”。例如,旧数据类型是否支持某些功能,而新数据类型不支持这些功能? 至少由于截断而导致的数据丢失似乎不是问题,因为新类型至少与旧类型一样大。

2
具有更多列的单个表与具有更少列的多个表
对于社交网站,哪种数据库设计更好?具有更多列和更少行的单个表,还是具有更少列但更多行的多个表? 例如:用户可以在自己的墙上或群组中发布更新。 我可以想到的两种数据库设计是: 设计1 用户帖子 ID 用户身份 发布 约会时间 UserGroupPost: ID groupId 用户身份 发布 约会时间 潜在问题:可能需要加入,这可能(将来)成为缓慢的查询。 设计2 帖子: ID 用户身份 groupId 发布 日期时间(如果用户在墙上张贴,则groupid将为null) 潜在问题:循环遍历大型数据集可能需要花费很长时间。 数据增加时如何获得更好的性能?还有其他(更好)的方法吗?

2
有关基础设计,首次数据库设计的建议
我正在学习成为一名Java开发人员的课程。 该课程涉及使用数据库,但是不幸的是,我们从未真正设计任何数据库。 大多数时候,我们会获得预制数据库,并且必须在其上实现代码以插入,更新,读取或删除数据。 但是,当我进行最后的测试时,很可能我会做一些涉及数据库的事情,因此我想尝试设计一些较小的项目以摆脱设计的束缚,因为我注意到良好的数据库设计在编写代码以使用它。 我希望这里允许这些类型的问题,并且不会太广泛。 这是东西简单做了一个小设计,我clubs和members同addresses和phonenumbers。 将有多个俱乐部。 每个俱乐部将有多个成员(明显) 成员不能成为多个俱乐部的成员 成员可以具有多个电话号码和电子邮件地址 会员只能有一个地址 一个地址可以属于不同的成员(夫妇或兄弟姐妹) 我最大的困惑: 如果我想在其中添加Club描述所有者(也将是成员)的列,那么最好是在没有两次列出相同成员的情况下的最佳方法? 我应该将所有表格放在id的自动增量上,还是一个坏主意?(好处/缺点?) 如果在“外键”选项卡中添加外键,这些外键会自动对应于正确的表吗?还是也必须将它们添加到列中?(见图2) 而我在所有可能noobiest问题...我是否把的外键phonenumber并email在各自的表链接到一个PERSON_ID或者我应该把phoneNumber的和电子邮件标识的在人的表? (我对图片中的语言不是英语表示歉意,希望这不是太大的问题)

4
重叠的候选键到底是什么?
有人可以简单地给我解释一下overlapping candidate key吗?overlapping顾名思义,这是什么意思? 考虑以下关系 R(L,M,N,O,P) { M -> O NO -> P P -> L L -> MN } 上面的哪个功能依赖性在上面的关系中带来了重叠的候选键? 让我们将讨论范围限制为依赖项,目前我对BCNF不感兴趣

1
如何用多个父母代表有向图?
http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html提供了一种用于从闭包表中插入和删除的算法。 除了节点可能具有多个父节点外,我想对类似的数据结构进行建模。 鉴于: 如果我们删除,[B, C]我期望最终得到: 如果我们删除节点,B我期望最终会得到: 但是,如果使用作者的算法删除链接或节点,则会注意到它标记[D, C, 1]为删除,这是不可取的。 到目前为止我尝试过的 我尝试通过添加一references列来适应原始数据结构,该列指示在两个节点之间有多少种行进方式。在上面的例子中,你可以从旅行A到C要么通过B或通过D。这个想法本来是要B删除的,从A到的路径C会保留,引用计数从2减少到1。从理论上讲这很好,但是我不知道如何使实现正常工作,现在我想知道是否这是有可能的(数据结构可能没有足够的信息来确定要删除的行)。 我在问什么 您将如何调整封闭表来支持多位家长?您会推荐哪些替代数据结构?https://stackoverflow.com/q/4048151/14731包含此类数据结构的详尽列表,但尚不清楚哪个数据结构支持(或最适合)多个父级。

2
我对事实表粒度的理解正确吗?
我自己和我们公司的另一个DBA的任务是审查供应商为我们开发的数据库设计。该供应商表示,他们使用Kimball作为其设计的基础。(注意:我不是在寻找Kimball与Inmon等的论点。)他们设计了一个具有多个事实和维度的集市。 公平地说,我们公司从未设计过一个集市。我们一直都有顾问来做。而且我们从未上过课。因此,我们对仓储/超市/维度建模等的了解是基于我们的经验不足,可以在互联网上找到的内容以及自我阅读(我们拥有Inmon和Kimball的书,并正在努力通过它们进行学习) 。 现在已经为我的知识水平奠定了基础,现在我们来应对设计挑战。 有一个称为“索赔损失统计”的事实表(用于保险)。他们正在尝试同时获取索赔的付款(累计到每月水平),然后是准备金中的钱(类似于用于索赔的银行帐户)。他们希望看到每月的付款金额(没什么大不了的)。但是他们希望看到该帐户当前的准备金余额。 我将给出一个图片示例。 假设我们为索赔设置了1000美元的储备金。这被搁置了(因此在某些方面它的功能有点像银行帐户)。 在2014年10月,我们尚未支付任何款项。因此,该公司希望在10月底看到付款和储备金余额。 ----------------------------------------------- - MONTH_YEAR - PAYMENTS - RESERVE_BALANCE - ----------------------------------------------- - 102014 - 0.00 - 1000.00 - ----------------------------------------------- 然后十一月来了。我们会分别支付$ 100,$ 150和$ 75美元。他们希望看到这些总额,余额中的准备金如下: ----------------------------------------------- - MONTH_YEAR - PAYMENTS - RESERVE_BALANCE - ----------------------------------------------- - 102014 - 0.00 - 1000.00 - ----------------------------------------------- - 112014 - 325.00 …

3
如何创建具有相同约束和索引的新表?
我正在创建一个具有主键约束和该表中的非聚集索引的新表。 我知道,我想创建另一个具有相同结构和值以及键和索引的表。 create table Dummy (id integer ,name varchar(20),salary integer Constraint PK_Con_id primary key(id)) insert into Dummy values(11,'AAA',1000); insert into Dummy values(12,'BBB',2000); insert into Dummy values(13,'CCC',3000); insert into Dummy values(14,'DDD',4000); select * from Dummy; create nonclustered index IX_Name on Dummy(Name) 现在,我正在创建Dmy表,但是“键和约束”未反映Dmy在SQL Server 2008 R2的表中。 SELECT * INTO Dmy FROM Dummy

1
三元关系:拥有一个表和拥有多个表有什么区别?
考虑以下三元关系: 假设所有实体只有两个属性(PK和名称)。 这是我导出的表(5个表): Sector ------------------------- ID_Sector SectorName ------------------------- Product ------------------------- ID_Product ProductName ------------------------- Company -------------------------------------- ID_Company ID_Sector CompanyName -------------------------------------- Relationship 1 (R1) ------------------------- ID_Sector ID_Product ------------------------- Relationship 2 (R2) ------------------------- ID_Company ID_Product ------------------------- 题: 对于这种三元关系,这是一个好的解决方案吗?有2个表(R1和R2)而不是下面的单个表有什么区别: Ternary table ------------------------------------- ID_Sector ID_Company ID_Product ------------------------------------- 在我看来,与每个关系(R1和R2)有两个单独的表相比,有一个表是一个更好的解决方案,但是我不知道这是否是真的,或者这是一个好习惯。

2
此数据的最佳关系数据库结构
我正在为以下情况创建数据库方案: 有用户 用户具有角色(例如“开发人员”或“ CEO”) 角色具有应用程序(例如“ Topdesk”) 应用程序具有权限(例如“更新知识库”) 如果角色已经可以访问应用程序,则该角色可以具有权限 假设没有高性能环境(无需针对速度进行优化),那么实现此架构的最佳方法是什么?数据库环境可以是MySQL,MSSQL ...更多是关于关系数据库的设计。 我本人提出以下建议: 我最不确定的部分当然是Applications_Permissions_Roles表。它是另一个链接表之上的链接表。我以前从未使用过或看过。做到这一点的另一种方法是将其替换为“角色”和“权限”之间的链接表,然后使用代码或约束来确保所需的关系...但这对我来说似乎不是一个好的解决方案。这些事情应该在数据库级别(如果可能)上强制执行,而不是在代码级别上强制执行。 其次,是否需要Permissions.Application和Applications.Id之间的链接?我之所以使用它,是因为Roles_Applications中可能没有任何行(例如,当您刚刚添加了新应用程序时),因此无法确定哪些权限属于哪个应用程序。它也是查阅权限所属于的应用程序的单一参考点。我想这是对的,但它在数据库设计中也有影响。尝试将ON_DELETE或ON_UPDATE设置为级联时,会出现MSSQL错误。 有什么建议,或者这是应该怎么做的?也欢迎任何其他有关命名约定的建议(例如作为评论)。 谢谢, 卢克 编辑:更改标题,希望使其更清晰。前一个比较全面,但可能太复杂了。

4
数据库设计-具有共享标签的不同对象
我的背景更多是网络编程而不是数据库管理,所以如果我在这里使用错误的术语,请指正。我正在尝试找出为我要编写的应用程序设计数据库的最佳方法。 情况:我在一个表中有“报告”,在另一表中有“建议”。每个报告可以有许多建议。我还有一个单独的关键字表(用于实施标记)。但是,我只希望将一组关键字同时应用于“报告”和“建议”,以便搜索关键字可以将“报告”和“建议”作为结果。 这是我开始的结构: Reports ---------- ReportID ReportName Recommendations ---------- RecommendationID RecommendationName ReportID (foreign key) Keywords ---------- KeywordID KeywordName ObjectKeywords ---------- KeywordID (foreign key) ReportID (foreign key) RecommendationID (foreign key) 本能地,我觉得这不是最佳选择,应该让我的可标记对象继承自一个公共父对象,并对该注释父对象进行标记,这将给出以下结构: BaseObjects ---------- ObjectID (primary key) ObjectType Reports ---------- ObjectID_Report (foreign key) ReportName Recommendations ---------- ObjectID_Recommendation (foreign key) RecommendationName ObjectID_Report (foreign …

3
适当的多语言模式,还是矫kill过正?
更新2:我实际上已经使用了它,经过几次调整后,它很棒。这是我关于其实际设计并在实践中的文章:http : //tim.hithlonde.com/2013/lemon-schema-works/ 我正在构建一个Web应用程序,并且希望它支持多种语言。此结构包含两个组件: 用词条连接语言环境(“英语”,“荷兰语”等),并用Rosetta Stone连接词条和特定语言的词条。 按页面对术语进行分组。我不想通过页面上可能需要的30多个术语来选择SELECT term1,term2等。我想问一下他们所连接的页面。 这是我建议的表结构(请注意,所有ID之间都具有关系/索引以进行非常有效的查询): * locale * id * value //English, Deutch, etc// * terms * id * value //In English// * page * id * value //Think add entry, menu// * page_group //group all terms to a page, for easy pulling// * id * …


2
一个表中如何有两个自动增量列?
我有一个MySQL表,其中包含有关公司发票的信息。但是,该公司有两个分支机构,每个分支机构都有唯一的发票顺序;可以说是“意甲”和“乙”。但是,这是一家公司,我不想创建两个发票表。相反,我不知何故要为一个表具有两个不同的自动增量。我知道从技术上讲这是不可能的,但是我想这是其他人以前解决过的问题,所以我想知道是否有众所周知的“解决方案”吗? 我现在正在执行的操作不是使用主键作为发票编号(这是理想的选择),而是使用带有发票ID的辅助列,该ID手动增加(使用PHP脚本,但是仍然不是自动的) ),请查看该特定系列的最新发票。 这是我当前的设置: CREATE TABLE `invoices` ( `id` mediumint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, `invoicenumber` mediumint unsigned NOT NULL, `branch` enum('A','B') NOT NULL, `date` date NOT NULL, `client` varchar(100) NOT NULL ) COMMENT='' ENGINE='InnoDB'; 要检查最新发票,我运行: SELECT MAX(invoicenumber+1) AS new_invoice_number FROM invoices WHERE branch = 'A'

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.