Questions tagged «database-design»

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

2
为多种用户类型及其联系信息建模数据库结构
我正在设计一个数据库,该数据库将存储各种类型的用户。他们主要(但不是唯一)是演员,导演和作家。当前只有四种相关的用户类型。这个数字可能会有所增加,但是可能性很小-在这种情况下,这个数字很小。 该计划是要有一个users表,几乎只负责登录该网站(name,email以及一password列和另外两列,例如它们是否已被批准,以及updated_at),以及每个用户类型的附加表有自己独特的一组列。例如,只有演员才会有种族栏,只有导演会有传记栏,只有作家才需要提供位置。但是,由于我以前没有管理过这种复杂的数据库,所以我想知道如何组织几个方面: 首先,用户可以是以上类型中的任何一种,也可以是任何组合。因此,我了解到我需要director_user带有director_id和user_id列的表(例如)。这样是否足以按角色类型过滤所有用户? 其次,大多数用户会选择Twitter个人资料和电话号码。并且所有演员必须为其其他任何在线演员个人资料至少包含一个网址;目前可以包含三个,但是这个数目可能会增加。我是否认为每种可能的个人资料/联系方式的单独表格是组织数据的最佳方式,对吗?

2
星型架构和数据立方体之间的区别?
我参与了一个新项目,其中我必须从现有的关系数据库系统中创建数据多维数据集。 我了解到,现有系统的设计不正确,我不确定从哪里开始。 我的问题是: Star Schema和数据立方体之间有什么区别? 我必须从哪里开始?从星型模式还是直接从数据多维数据集? 数据立方体是从星形模式生成的吗? 我在关系数据建模方面经验不足,这个问题似乎太基本了,我试图从很少的资源中弄清楚,但仍不清楚。请给出您的意见和建议? 如果我错过了与此问题相关的非常重要的事情,请也分享您的想法。

2
存储可能是多种类型的值的最佳方法
我想以更直接,更笼统的方式再问一个问题: 如何创建一个表来存储可能是多种不同类型的值? 就我而言,这些值提供有关事件的诊断。例如:事件发生->存储来自多个PLC的读数,其中包含有关事件的相关信息。PLC可以监视任何类型的数据。 我能想到的一些例子: 为每种可能的类型创建一列,并创建另一列以指示要使用的列 例如:列:IntVal,StrVal,BoolVal,类型。值:null,null,True,“ BOOL” 将值存储为varchar

2
没有主键的表是否被标准化?
在一次演讲中,我的讲师向我们展示了一个没有主键的桌子。在询问时,他说在3NF中,当您删除传递依赖项时,可以有一个没有主键的表。 但是,没有主键意味着没有功能依赖关系-但是3NF消除了传递依赖关系,并且我被告知每个表都需要有一个用于规范化的主键,因为它全都与功能依赖关系有关。 我知道完全可以创建没有主键的表,但是如果该表存在,该数据库是否被视为规范化的? 我应该补充一点,该表没有任何“唯一键”,没有主键,没有复合键,没有外键。 所显示的表具有三个属性,没有一个被标记为主要或唯一。我问这是否是一个错误,他说没有一个是很好。我质疑此评论,因为表中的任何信息都无法唯一标识,他声称可以这样。这违背了我关于标准化的知识。

2
SQL Server关于旧黑客的建议[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 3年前关闭。 晚上伙计们和女孩们,我希望你们中的一些传说能够在这里帮助我:) 我上次在黑暗时代使用SQL Server的版本是7(我们一起擦了两根木棍以使之运转)。现在,我在21世纪,并且想再次回到DBA的工作。 我想设置一个“廉价”虚拟机和实例,然后进行最新的认证(我认为最新的认证将于2017年4月开始,这对我来说是个不错的时机)。我对BI方面特别感兴趣。 谁能为虚拟机推荐好的托管服务提供商?我是简单地获取Windows Server并从那里去还是可以在某处获取软件包?我承担的Azure还是其他地方?我怀疑有很多选择,希望您可以分享一些不错的选择:) 加上其他有用的提示,我们非常欢迎!

4
第一个范式:确定性定义
我试图得到什么是第一范式的确定版本。我阅读的所有内容都有一个稍微不同的旋转。 许多机构(例如Date)说,根据定义,关系始终是“第一范式”,而其他机构则列出了要求列表。这意味着对1NF的需求从零到很多。 我猜想区别在于表和关系之间的关系:表可能是一个完整的混乱,而关系则受到某些限制。关系在SQL中表示为表的事实因此造成了一些混乱。 我特别关注与SQL数据库有关的1NF。问题是:要确保表格采用第一范式需要哪些属性? 许多权威人士建议,如果表表示一个关系,则该表已经存在于1NF中。这将1NF的定义推回到关系的定义。 以下是1NF中表格的一些属性: 列顺序微不足道[1] 行顺序微不足道 所有行的长度相同(即,行数据与列标题匹配) 没有重复的行(可以使用代理主键来保证,但是PK本身不是必需的) 没有重复的列 每一列包含一个单一值(原子) [1]从技术上讲,属性是无序的,但是在表中,行数据的顺序必须与列标题的顺序相同。但是,实际顺序并不重要。 在多个数据上: 原子数据的概念是不能进一步分解项目。此概念已经过资格验证,尽管从技术上讲,所有内容都可以细分为恶心,但实际上,取决于所使用的数据的方式,所讨论的数据无法进一步细分。 例如,完整的地址或全名通常应进一步细分,但是诸如给定名称或城镇名称之类的组件可能不应进一步细分,尽管事实上它们可以是字符串。 至于重复的列,它是一个设计不良列具有近重复列,例如phone1,phone2等。通常,重复数据指示用于一个附加的相关表的需要。 依存关系 行之间不应有任何关系,除非它们符合相同的标题。 列之间也应该没有关系,但是我认为这是较高范式的主题。 问题是:上面的多少在1NF的定义中?独立行位也进入其中吗?

1
表存储的层次结构中的层次结构权限
假设以下数据库结构(如有需要,可以修改)... 我正在寻找一种确定给定页面上给定用户的“有效权限”的好方法,该方法允许我返回包含Page和有效权限的行。 我认为理想的解决方案可能包括使用CTE来执行递归的功能,以评估当前用户给定页面行的“有效权限”。 背景和实施细节 上面的架构表示内容管理系统的起点,在其中可以通过将用户添加到角色或从角色中删除来授予用户权限。 系统中的资源(例如页面)与角色关联,以授予链接到该角色的用户组所授予的权限。 这个想法是能够通过简单地拒绝所有角色并将树中的根级别页面添加到该角色,然后将用户添加到该角色来轻松锁定用户。 当(例如)为公司工作的承包商长期不可用时,这将允许许可结构保留在原位,然后通过简单地从该角色中删除用户,也将允许相同的原始权限授予。 权限基于典型的ACL类型规则,遵循这些规则可能适用于文件系统。 CRUD权限应为可为空的位,因此,在满足以下条件的情况下,可用值是true,false和未定义: 假+任何东西=假 正确+未定义=正确 真+真=真 未定义+未定义=未定义 如果任何权限为假->假 否则为true-> true 其他(所有未定义)-> false 换句话说,除非您通过角色成员资格授予任何权限,并且拒绝规则将覆盖允许规则,否则您将无任何权限。 应用于此权限的“集合”是指直到当前页面并包括当前页面的所有应用于树的权限,换句话说:如果将false应用于应用于此页面的树中任何页面的任何角色,则结果为false ,但是如果未定义到此处的整个树,则当前页面包含true规则,则此处的结果为true,但对父级而言将为false。 如果可能的话,我想宽松地保留db结构,同时请记住,我的目标是能够执行以下操作:select * from pages where effective permissions (read = true) and user = ?因此,任何解决方案都应能够使我拥有一个具有有效权限的可查询集。以某种方式(只要可以指定条件,返回它们是可选的)。 假设存在2个页面,其中1个是其他角色的子代,并且存在2个角色,一个用于admin用户,一个用于只读用户,这两个页面都仅链接到根级别页面,我希望看到这样的内容作为预期的输出: Admin user: Id, Parent, Name, Create, Read, Update, Delete 1, null, Root, True …

1
设计一个友谊数据库结构:我应该使用多值列吗?
假设我有一个名为的表User_FriendList,它具有以下特征: CREATE TABLE User_FriendList ( ID ..., User_ID..., FriendList_IDs..., CONSTRAINT User_Friendlist_PK PRIMARY KEY (ID) ); 让我们假设该表包含以下数据: + ---- + --------- + --------------------------- + | ID | 用户名 | Friendlist_IDs | + ---- + --------- + --------------------------- + | 1 | 102 | 2:15:66:35:26:17:| + ---- + --------- + --------------------------- + …

2
数据仓库:如何查询每日快照?
我有一些不是时间序列的数据库快照。例如: 快照第一天: +----+---------------+------------+------------+ | ID | Title | Category | Date | +----+---------------+------------+------------+ | 1 | My First Post | helloworld | 2015-01-01 | +----+---------------+------------+------------+ 快照第2天(今天添加了新帖子): +----+----------------+------------+------------+ | ID | Title | Category | Date | +----+----------------+------------+------------+ | 1 | My first post | helloworld | 2015-01-01 | | 2 …

2
NoSQL:什么是非结构化数据?
目前,我们基于mssql服务器的解决方案正在资源边缘运行。 现在,关于下一步解决负载的问题,我们有许多传统的选择: 购买更快的CPU和IO 拆分一些客户以分离服务器 将数据库移到群集 就许可和硬件或时间而言,所有这些都是昂贵的。因此,我想通过将整个系统移至nosql引擎cassandra承诺的可伸缩解决方案中来添加另一种选择。 但是,我不确定noSQL数据库也没有使用过SQL数据库,因此我需要了解“非结构化”数据的结构。 在我们的应用程序中,我们基本上将用户以各种方式输入的数据存储为“键值”列表。有一个父表,它包含head元素(如Order),还有一个子表,其键值对包括该订单的内容(如Order_Lines)。 在业务方面,Order和OrderLines是一个单位。但是由于RDBMS,它们存储在表中,并且必须一直连接。 在操作过程中,有时我们选择只加载顶部,但是在大多数情况下,我们加载头行+一些KVP以显示一些有用的信息。 例如,在概述列表中,我们在每行的列中显示头标识符+一些值。 更新:我们存储任何形式的表格。因此,基本上我们存储“文档”。但是,我们必须按任何值,排序等来准备和搜索这些形式。数据访问控制在数据库上增加了另一层兼容性。 您可能会猜到,某些KVP的数量和可用性因对象而异。没有有效的可能性为每种对象创建单个表,因为我们必须为不同的数据组合创建数千个表。 这种“字典”之类的数据集会更好地存储在noSQL数据库中吗?并从中获得性能收益吗?卡桑德拉会将这些head + KVP建模为一个数据集吗?看看cassandra网页和一些教程,我的印象是,在数据组织方面,我们的RDBMS和cassandra之间并没有太大的区别-如果您要选择5个KVP,我们将拥有大量的连接为每一行的列表。 欢迎启蒙,也可以使用指向这些问题的论文的指针。

3
将除一列以外的所有列标记为主键是否合理?
我有一张代表电影的桌子。字段是: id (PK), title, genre, runtime, released_in, tags, origin, downloads。 我的数据库不能被重复的行污染,所以我想强制唯一性。问题在于,除了tags和之外,不同的电影可能具有相同的标题,甚至相同的字段downloads。如何实施唯一性? 我想到了两种方法: 使除downloads主键之外的所有字段。我将其downloads排除在外,因为它是JSON,它可能会影响性能。 仅保留id为主键,但为所有其他列添加唯一约束(再次除外downloads)。 我读过这个非常相似的问题,但是我不太明白该怎么办。当前,该表与任何其他表均不相关,但将来可能与此相关。 目前,我的记录略少于20,000,但是我希望这个数字会增加。我不知道这是否与问题有关。 编辑:我修改了架构,这是我将如何创建表: CREATE TABLE movies ( id serial PRIMARY KEY, title text NOT NULL, runtime smallint NOT NULL CHECK (runtime >= 0), released_in smallint NOT NULL CHECK (released_in > 0), genres text[] NOT NULL default …

1
有效地存储键值对的集合,这些键值对具有完全不同的键
我继承了一个将许多不同类型的活动与站点相关联的应用程序。大约有100种不同的活动类型,每一种都有3-10个字段的不同集合。但是,所有活动至少都有一个日期字段(可以是日期,开始日期,结束日期,预定开始日期等的任意组合)和一个负责人字段。所有其他字段的差异很大,开始日期字段不一定称为“开始日期”。 为每种活动类型创建一个子类型表将导致具有100个不同子类型表的模式,这太麻烦了以至于无法处理。该问题的当前解决方案是将活动值存储为键值对。这是当前系统的一个大大简化的架构,可以用来说明要点。 每个活动都有多个ActivityField;每个站点都有多个活动,并且SiteActivityData表存储每个SiteActivity的KVP。 这使基于Web的应用程序非常容易编写代码,因为您真正需要做的就是遍历SiteActivityData中给定活动的记录,并为表单的每一行添加标签和输入控件。但是有很多问题: 诚信不好;可以在SiteActivityData中放置一个不属于活动类型的字段,而DataValue是一个varchar字段,因此需要不断地转换数字和日期。 报告和临时查询此数据非常困难,容易出错且速度很慢。例如,要获得某个结束日期在指定范围内的某种类型的所有活动的列表,则需要进行数据透视并将varchars转换为日期。报表编写者讨厌这种模式,我不怪他们。 因此,我要寻找的是一种存储大量几乎没有共同字段的活动的方式,从而可以简化报告。到目前为止,我想出的是使用XML以伪noSQL格式存储活动数据: Activity表将包含每个活动的XSD,从而无需使用ActivityField表。SiteActivity将包含键值XML,因此站点的每个活动现在都位于一行中。 一个活动看起来像这样(但是我还没有完全充实它): <SomeActivityType> <SomeDateField type="StartDate">2000-01-01</SomeDateField> <AnotherDateField type="EndDate">2011-01-01</AnotherDateField> <EmployeeId type="ResponsiblePerson">1234</EmployeeId> <SomeTextField>blah blah</SomeTextField> ... 优点: XSD将验证XML,捕获错误,例如在数据库级别将字符串放入数字字段中,这对于将所有内容都存储在varchar中的旧模式是无法实现的。 用于构建Web表单的KVP记录集可以很容易地使用 select ... from ActivityXML.nodes('/SomeActivityType/*') as T(r) XML的xpath子查询可用于生成一个包含开始日期,结束日期等列的结果集,而无需使用数据透视表,例如 select ActivityXML.value('.[@type=StartDate]', 'datetime') as StartDate, ActivityXML.value('.[@type=EndDate]', 'datetime') as EndDate from SiteActivity where... 这似乎是个好主意吗?我想不出其他方式来存储大量不同的属性集。我的另一个想法是保留现有模式,并将其转换为更容易在数据仓库中查询的内容,但是我以前从未设计过星型模式,也不知道从哪里开始。 附加问题:如果我使用定义XSD中具有日期数据类型的标记xs:date,SQL Server会将其索引为日期值吗?我担心如果我按日期查询,它将需要将日期字符串转换为日期值并浪费使用索引的任何机会。

4
不知道如何将变量实体转换为关系表
简介和相关信息: 以下示例说明了我面临的问题: 动物有种族,可以是猫或狗。猫可以是暹罗语或波斯语。狗可以是德国牧羊犬或拉布拉多犬。 动物是一个强大的实体,而其种族是可以具有两个提供的值(猫或狗)之一的属性。 这两个值都很复杂(我在这里仅添加了dog / cat的类型来说明问题,但也可能有cat / dog的名字和其他东西)。 问题: 我不知道如何为该示例创建关系表。 我为解决问题所做的努力: 我尝试使用Chen的符号来绘制ER图,该图代表了问题,但作为一个初学者,我不知道我是否做对了。这是我得到的: 如果我画错了,我深表歉意,如果是的话,请纠正我。我不仅希望获得“免费的解决方案”,而且希望学习如何处理该问题,以便将来自己解决。 我唯一想到的就是创建两个单独的表,一个用于猫,一个用于狗。同样,“ 动物”表中的“ 种族”属性将仅存储猫或狗的值。像这样: Animal< # Animal_ID, race, other attributes > Cat < # Cat_ID, $ Animal_ID, breed > Dog < # Dog_ID, $ Animal_ID, breed > 我对解决方案确实感觉很不好,我担心这是错误的,因此出现以下问题。 问题: 如何将示例转换为ER图? 如何将ER图转换为关系表? 如果需要更多信息,请发表评论,我将尽快更新我的帖子。也可以随意添加适当的标签,因为我在这里还很陌生。 谢谢。

3
PK作为ROWGUIDCOL还是使用单独的rowguid列?
这里正在进行一场激烈的辩论,所以我想听听其他意见。 我有很多带有uniqueidentifier集群PK的表。这是否是一个好主意在这里超出了范围(并且不会很快改变)。 现在,必须合并发布数据库,并且DEV提倡使用单独的rowguid列,而不是将现有PK标记为ROWGUIDCOL。 基本上,他们说应用程序永远不应将仅用于复制的内容带入其域(对于他们来说,这只是“ DBA内容”)。 从性能的角度来看,我没有理由为什么要添加一个新列来执行现有列可以做的事情。而且,由于它只是“ DBA的东西”,为什么不让DBA选择? 我有点理解DEV的观点,但是我仍然不同意。 有什么想法吗? 编辑:我只是想补充一点,在这场辩论中我是少数派,而质疑我立场的DEV是我尊敬和信任的人。这就是我诉诸意见的原因。 我可能还缺少一些东西,可能会误解了他们的观点。

2
查找具有相同的子行集的父行
假设我有一个这样的结构: 食谱表 RecipeID Name Description RecipeIngredients表 RecipeID IngredientID Quantity UOM 关键RecipeIngredients是(RecipeID, IngredientID)。 查找重复食谱的一些好方法是什么?重复配方定义为具有完全相同的一组配料以及每种配料的数量。 我曾经考虑过使用FOR XML PATH将成分合并到一个单独的列中。我尚未对此进行全面探讨,但是如果我确保成分/ UOM /数量按相同顺序排序并具有适当的分隔符,那么它应该可以工作。有更好的方法吗? 有48K食谱和200K成分行。

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.