- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要存储一组实体,其中有几个专门的版本。它们具有一些共同的属性,但是专门的属性包含特定于该实体的属性。
解决方案
数据存储区是一个关系DBMS,这不用于讨论:-)具体来说,它是Microsoft SQL Server 2005。
我可以轻松地为公用属性创建一个表,然后为每个专用版本创建一个表。但是,很可能以后必须将新实体添加到解决方案中,并且我不想同时维护对象模型和数据库架构。
另一个想法是创建一个表
reading(<common properties>, extended_properties)
extended_properties
字段是扩展属性的某种序列化。我在想JSON或XML。我很可能会使用ORM框架,但尚未决定。无论哪种方式,来自
reading
的专用实体的对象表示都可以公开包含
{extended_property_name, value}
字段中解析的键/值对的字典
extended_properties
。
extended_properties
字段中XML内容的查询也可以考虑这些内容。
reading
表和扩展属性序列化的建议。
最佳答案
Anders,不要放弃任何完整性或硬度,例如类型安全性。
(响应即将到来)。
@安德斯不,一点也不好,子类型很好(问题是您使用哪种形式,什么是弊端)。不要放弃任何强度或完整性,类型安全性或支票或DRI。您选择的表格将需要额外的支票和一些代码(取决于您的平台)。
这个主题经常出现,但是寻求者总是有一个狭窄的视野。我不断从不变的集合中做出相同的陈述(子集)。想法是评估所有选项。所以我在写文档。不幸的是,这花费了更长的时间。也许有4页。还没准备好发布。但是图表已经完成,我想您已经准备就绪,您可以立即使用它。
警告:仅限经验丰富的项目建设工程师
道路不适合大篷车或高Eek因数的读者
链接到“正在构建的文档”中的▶Four Alternative Data Models◀。为地板上的混乱而道歉;我会尽快清理的。
▶Link to IDEF1X Notation◀适用于不熟悉关系数据库建模标准的任何人。
它们都是关系型的,具有完全的完整性。
6NF选项。今日关系(SQL)不提供对6NF的支持;它不禁止它,只是不提供5NF➔6NF结构。因此,您需要构建一个小的目录,有些人称之为“元数据”。实际上,它只是标准SQL目录(sys表)的扩展。每个选项都模拟了所需的控制级别。
从根本上说,EAV可以正确地完成,具有完全的控制和完整性(类型安全,声明性引用完整性),而不是通常的混乱情况。
您可能对以下相关问题/答案感兴趣(特别是查看数据模型):
Multiple Fixed vs Abstract Flexible
Database Schema-Related Problem
"Simple" Database Design Problem
对评论的回应
...这样,我们可以轻松获取与给定的特殊类型实例关联的“注释”行。是这样做的方法,还是我以后会后悔这一决定?我们还有其他模式吗?
不明白你的意思。注释,注释,地址最终在许多表中使用(驻留在各列中),因此正确的方法是将其标准化。提供一张表格供评论;从任何需要它的表中引用。这是通用的注释表。因为您声明了任何产品,所以用在产品(超类型)中。它可以在某些产品子类型中轻松使用,而在其他产品子类型中则不容易使用。在这种情况下,FK将在所述产品子类型中。
Your Data Model
产品5NF /子类型示例中的ProductType表的用途是什么?它是否包含与每个专用产品(例如ProductCPU)相对应的行?我假设它表明基本产品是哪个专业。
(图中的小严重错误,已更正。)
对,就是这样。
用标准关系术语(不是作为数据库传递的不受控制的消息),ProductType是鉴别符;它标识哪些产品子类型适用于此产品。告诉您需要与哪个产品子类型表连接。这对在一起构成了一个合乎逻辑的产品。不要忘记生成视图,每个产品类型一个。
(请针对四个数据模型分别评估ProductType的变化方式,以及它所扮演的角色。)
“通用化—专业化”是面向对象的所有术语。无需跨越界限并了解Relational 30年来的能力。如果您了解一些有关Relational的知识,那么您将拥有全部能力;否则,您仅限于非常有限的面向对象的方法(Ambler和Fowler有很多要回答的问题)。请从10年12月11日开始阅读this post。关系数据库不是实体而是实体,而是实体。不是课程。
例如,添加新产品时,您需要提供例如可以添加哪些产品类型的下拉选择。基于此选择,可以推断出将数据放入哪些表。对吗?很抱歉谈论应用程序代码,但我只需要将其放在透视图中
是。接下来要提供什么页面(带有字段),供用户输入数据。
毫无疑问,讨论将使用Rdb的应用程序代码,它们像夫妻一样(而不是夫妻)在一起。
对于OO类,在完成Rdb建模后,将Class树映射到Rdb,而与将使用它的任何应用程序无关。并非相反。而不依赖于一个应用程序。
忘了“持久”,它有很多问题(丢失更新;损坏的数据完整性;有问题的调试;大量争用;等等)。 Rdb的所有更新都应在符合ACID要求的“交易”中进行30年,但Fowler和Ambler尚未阅读。通常这意味着一个存储的过程。
判别式是我们前面建立的类型表的FK。它表示哪个规格。基本类型遵守的子类型。但是判别表详细包含什么?
从数据模型中不清楚吗? ProducType CHAR(1)
或(2). Name Char(30)
。
可能是易于显示的文本,说明用于UI的类型,
是的,除其他外(例如控制,约束等),消除编码或报告时的歧义。
但是它还包含包含特殊类型的确切表名吗?
否。这太实际了,无法放入数据中。原则上不允许。
但这不是必需的。
假设我对ID = 1的产品感兴趣。它有一个判别式,表明它是一个ProductCPU。您将如何从应用程序代码中检索此ProductCPU?
如果采用提供的模型并将其(所有表)正确地实现为类,则将很容易。您请求的示例将不使用视图(用于列表,更通用)。伪代码为:
给定ProductId
(子类型未知,因此您不应该坐在特定于子类型的窗口中),仅加载Product
超类型
根据鉴别符Product.ProductType
,设置指示器等,并加载ProductCPU; ProductMemory; ProductDisk; ProductTape
之一的适用子类型;等等
我已经看到(并且不同意)OO方法立即为给定的ProductId
加载所有子类型:一种子类型有效;另一种有效。其余的无效。代码仍然必须将自身限制为基于Product
的Product.ProductType
有效类。
或者,例如。在上下文所在的位置,用户正坐在特定于子类型的窗口中。设置了该类的ProductCPU
,并请求ProductId
xxx。然后使用ProductCPU
视图。如果返回零行,则不存在。
可能有一个ProductDisk
xxx,但没有一个ProductCPU
xxx。如何处理,是否指示存在Product`xxx但不是CPU,则取决于应用程序要求。
对于列表,其中应用程序填充了网格,而不考虑ProductId
,请使用视图(每个视图)加载每个网格。该SQL是基于联接的,不需要引用ProductType
。
关于database-design - 可以支持专用属性的数据库架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4304217/
我们使用 Azure 弹性池,生成多个客户端数据库和一个引用客户端数据库的主数据库。 我们已经拥有多个数据库,并且正在开发新版本的代码。我们使用 EF6 代码优先。当我们对模型进行更改(添加属性)时,
我们使用 Azure 弹性池,生成多个客户端数据库和一个引用客户端数据库的主数据库。 我们已经拥有多个数据库,并且正在开发新版本的代码。我们使用 EF6 代码优先。当我们对模型进行更改(添加属性)时,
我希望将一些信息分发到不同的机器上,以便在没有任何网络开销的情况下实现高效和极快的访问。数据存在于关系模式中,实体之间的关系是“加入”的要求,但根本不是写入数据库的要求(它会离线生成)。 我非常相信
我使用 GrapheneDB 来托管我的 neo4j 数据库 (db)。 问题 我有 N客户并且正在寻找自动分离他们的内容(他们独特的数据库)的方法,以便: 它不重叠数据 操作速度不受影响。 选项 1
当服务器开始工作(Tomcat)时,日志显示此错误: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid b
我在 Oracle 数据库实例中按以下方式创建了一个触发器。 CREATE OR REPLACE TRIGGER after_logon_on_database AFTER LOGON ON DATA
原谅我的无知,我是数据库约定的初学者。 这是我的 SQLite 代码:(由我的数据库浏览器自动生成) CREATE TABLE `ResearchItems` ( `ID` INTEGER NO
是的是的是的,我已经在整个互联网上搜索过这个问题。一些结果发现,甚至来自 Stackoverflow。但是他们中的大多数人说“你应该自动加载数据库”,或者“parent::__construct();
我正在创建一个 Mac 应用程序,它将一些数据保存到 SQLite 数据库中。问题是:当我关闭数据库并再次打开时,数据不存在了。这是我的代码: NSString *sql = [NSString st
我正在建立一个网站,我打算发布各种帖子,比如教程、文章等。我打算用 php 来管理它,但是当涉及到存储每个帖子的内容时,将要显示的文本,更好的选择是:使用单独的文本文件还是将其添加为数据库中的每个条目
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
对不起,这个关键字对我来说没有任何意义...有人可以给我一个定义吗? 提前致谢... 最佳答案 这是一个品牌。 http://pervasive.com/这是他们的数据库产品的链接 http://ww
我已经在 docker 版本 1.10.1 的 docker 镜像中安装了 PostgreSQL 9.4.6。根据这张官方图片: https://github.com/docker-library/p
当我的 android 应用程序尝试读取 android 短信数据库时,我遇到了这个崩溃。读取android短信数据库的代码类似于下面的代码 fragment : String SMS_URI = "
我有一个 public kit repo,我推送了 v1.0.3 并具有以下结构 go -database --database.go --go.mod --go.sum 我需要它 require g
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我们正在使用MySQL数据库在Go中创建一个Web应用程序。我们的用户一次只能拥有一个活跃的客户端。就像Spotify一样,您一次只能在一台设备上听音乐。为此,我制作了一个映射,将用户ID和作为其值的
我已经尝试在 PostgreSQL 中创建数据库好几天了,遇到了几个问题,但似乎卡住了。 我在 PostgreSQL 中手动创建了一个名为 postgres_development 的数据库,因为 b
我正在创建一个 iMessage 应用程序,它需要连接到与我的常规应用程序相同的数据库。 我调用 FirebaseApp.configure() 并对用户进行身份验证,但出于某种原因,在所有 Data
就像std::unordered_map但所有数据都应存储在磁盘上而不是内存中。 按照我的理解,应该做两部分:索引和存储。我已经学习了一些关于索引的数据结构,比如 Linear-Hash 或 B-Tr
我是一名优秀的程序员,十分优秀!