标签: data-modeling

定义自定义产品类型的通用数据模型

我想创建一个产品目录,其中包含目录中每种产品类型的复杂细节.产品类型与它们有很多不同的数据; 一些只包含通用数据,一些包含一些额外的数据字段,一些包含许多特定于该产品类型的字段.我需要轻松地向系统添加新的产品类型并尊重它们的配置,我喜欢有关如何为这些产品设计数据模型以及如何处理持久性和检索的技巧.

有些产品非常通用,我打算使用通用的UI来编辑这些产品.具有与之关联的可扩展配置的产品将获得为其编辑而创建的新视图(和控制器).我希望所有自定义产品都定义了自己的模型,但是要共享一个共同的基类.基类将表示没有自定义字段的通用产品.

需要处理的示例产品:

  1. 通用产品
    • 描述
  2. 灯泡
    • 描述
    • 类型(带有荧光灯,白炽灯,卤素灯,led灯)
    • 瓦数
    • 风格(洪水,斑点等)
  3. 冰箱
    • 描述
    • 使
    • 模型
    • 样式(在域模型中使用枚举)
    • 水过滤器信息
      • 零件号
      • 描述

我希望使用MEF来发现系统中可用的产品类型.我计划创建包含产品类型模型,视图和控制器的程序集,将这些程序集放入bin中,让应用程序发现新的产品类型,并在导航中显示它们.

  1. 使用SQL Server 2008,存储这些不同类型的产品的最佳方法是什么,允许在不增加数据库模式的情况下添加新类型?

  2. 从数据库中检索数据时,将这些多态实体转换为正确的域模型的最佳方法是什么?


更新和澄清

  1. 为了避免内部平台效应,如果每个产品类型都有一个数据库表(用于存储该类型的产品),那么我仍然需要一种方法来检索跨越产品类型的所有产品.如何实现?

  2. 我与Nikhilk更详细地讨论了他的SharePoint参考.具体来说,他正在谈论这个:http://msdn.microsoft.com/en-us/library/ms998711.aspx.它看起来很有吸引力.无需解析XML; 并且可以进行一些索引,允许对数据进行简单快速的查询.例如,我可以说"找到所有75瓦灯泡",因为当行代表灯泡时,行中的第一个int列是瓦数.应用层中的某些东西(NHibernate?)将定义从产品类型到用户数据模式的映射.

  3. 投下具有属性表的架构,因为这可能导致每个产品有很多行.这可能会导致索引困难,而且所有查询都必须基本上转移数据.

sql database sql-server database-design data-modeling

6
推荐指数
1
解决办法
4059
查看次数

在AppEngine中思考

我正在寻找资源来帮助将我的设计技能从传统的RDBMS数据存储迁移到AppEngine DataStore(即:'Soft Schema'风格).我已经看过几个演讲,全部涉及总体主题和一些特定技巧.

我想知道是否有一个地方我们可以将经验("来自战壕")的知识汇集到现实世界的方法上,重新思考数据的结构,特别是移植现有的应用程序.我们基于Hibernate,并且可能已经使用我们的数据模型走错了路径,产生了一些我们的数据库正在努力解决的粗略查询.

请回复:

  1. 您已将一个非平凡的应用程序移植到AppEngine
  2. 您已经在AppEngine中从头开始创建了一种常见的应用程序
  3. 你没有做过1或2,但正在考虑它,并希望分享你自己的发现到目前为止.

python java google-app-engine data-modeling

6
推荐指数
1
解决办法
1010
查看次数

日期时间字段上的SQL Server主键

我在SQL Server 2005中创建一个新表,需要2个字段:DateTime和MyValue(Int32).DateTime字段将是唯一的,因此我将在其上设置唯一约束.

哪种表结构更好,为什么?

MyIndex(PK,int)
MyDate(datetime)(IX_UniqueKey)
MyValue(int)

要么

MyDate(PK,datetime)
MyValue(int)

我的感觉是我不想在这个表中使用人工PK(MyIndex),因为它是不必要的,因为日期将是唯一的,我将使用它们来访问任何记录.然而,拥有一个人工PK可能会更有效率......?

database-design sql-server-2005 data-modeling

6
推荐指数
1
解决办法
8428
查看次数

多个实体的通用一对多表

假设我有两个表,即客户和供应商.我想为客户和供应商地址提供一个公共地址表.客户和供应商都可以拥有一个到多个地址.

选项1

将AddressID的列添加到CustomerVendor表中.这对我来说似乎不是一个干净的解决方案.

Customer     Vendor         Address
--------     ---------      ---------
CustomerID   VendorID       AddressID
AddressID1   AddressID1     Street
AddressID2   AddressID2     City...
Run Code Online (Sandbox Code Playgroud)

选项2

将外键移动到Address表中.对于客户,Address.CustomerID将填充.对于供应商,Address.VendorID将填充.我也不喜欢这个 - 每次我想将它用于另一个实体时,我都不需要修改地址表.

Customer     Vendor         Address
--------     ---------      ---------
CustomerID   VendorID       AddressID
                            CustomerID
                            VendorID
Run Code Online (Sandbox Code Playgroud)

选项3

我也看到了这一点 - 在Address表上只有一个外键列,另一列用于标识该地址所属的外键表.我不喜欢这个,因为它要求所有外键表具有相同类型的ID.一旦你开始对它进行编码,它似乎也很混乱.

Customer     Vendor         Address     
--------     ---------      ---------
CustomerID   VendorID       AddressID
                            FKTable
                            FKID
Run Code Online (Sandbox Code Playgroud)

那么,我是不是太挑剔了,还是有什么我没有想到的?

database database-design data-modeling

6
推荐指数
2
解决办法
4616
查看次数

有一个人的表,我想链接到彼此,多对多,链接是双向的

想象一下,你生活在一个非常简单的例子中 - 想象一下你的MySQL数据库中有一个人员表:

create table person (
    person_id int,
    name text
)

select * from person;

+-------------------------------+
|   person_id |            name |
+-------------------------------+
|           1 |           Alice |
|           2 |             Bob |
|           3 |           Carol |
+-------------------------------+
Run Code Online (Sandbox Code Playgroud)

这些人需要协作/一起工作,所以你有一个链接表,将一个人的记录链接到另一个人:

create table person__person (
    person__person_id int,
    person_id int,
    other_person_id int
)
Run Code Online (Sandbox Code Playgroud)

这种设置意味着人们之间的链接是单向的 - 即Alice可以链接到Bob,而Bob没有链接到Alice,更糟糕的是,Alice可以链接到Bob , Bob可以同时链接到Alice,在两个单独的链接记录中.由于这些链接代表了工作关系,在现实世界中它们都是双向的相互关系.以下是此设置中的所有内容:

select * from person__person;

+---------------------+-----------+--------------------+
|   person__person_id | person_id |    other_person_id |
+---------------------+-----------+--------------------+
|                   1 |         1 |                  2 |
|                   2 |         2 …
Run Code Online (Sandbox Code Playgroud)

many-to-many data-modeling

6
推荐指数
1
解决办法
99
查看次数

逻辑模型与域模型

我不是数据库人.我对数据建模的理解并不广泛.从有限的理解来看,逻辑数据模型是物理数据模型的抽象,不包含特定存储产品/介质的任何特定内容.逻辑数据建模似乎确实涉及业务主题专家在他们的过程中,因此在我看来对冲领域模型的世界.

我认为逻辑数据模型更关注数据,而域模型更关注问题域.考虑归一化的逻辑模型,域模型较少.我只是让自己在这里感到困惑,所以如果有人可以通过例子简洁地清除两者之间的差异,我将不胜感激.

非常感谢!

database architecture database-design domain-driven-design data-modeling

6
推荐指数
2
解决办法
6300
查看次数

在Neo4j中,当粒度级别可以无限制时,应该使用什么级别的特异性?

使用图形数据库时,最难解决的问题是选择粒度级别.让我们说我有一个图表显示在一周中的某些日子发生的事情:垃圾日,周五墨西哥比克,周五BYOB等.

  • 我可以让每一天都成为一个节点(周一,周二,周三,......),这样,查询特定的日子很快.
  • 我可以创建一个名为Day的节点,并使用星期几添加属性名称.这样,显示图表中的所有日子都很容易查询.

对自己思考,使节点非常具体是不好的,因为粒度没有限制.例如,星期六早上,晚上和晚上,或者更糟糕的是,每天每小时一个新节点.我还可以通过将星期六节点通过"晚上"边缘链接到垃圾日节点来使边缘成为粒度的一个组成部分.

我偶尔遇到类似的问题,例如; 我应该根据一个人的全名创建一个新节点,还是一个名为"Person"的节点,其属性为"name".然后我根据便利性制作特定或一般的节点,但我觉得可能有一些最佳实践或更高级别的原则我缺少.我不清楚如何判断哪条路更好.

data-modeling neo4j

6
推荐指数
1
解决办法
205
查看次数

如何在多个表中强制使用唯一身份验证

我在MySQL服务器中有以下表:

Companies:
- UID (unique)
- NAME
- other relevant data

Offices:
- UID (unique)
- CompanyID
- ExternalID
- other data

Employees:
- UID (unique)
- OfficeID
- ExternalID
- other data
Run Code Online (Sandbox Code Playgroud)

在每一个中,UID是由数据库创建的唯一标识符.

有外键可以确保UID上Employee - > Office - > Company之间的链接.

办公室和员工中的ExternalID字段是公司(我的客户实际)提供给我的应用程序的ID.客户端没有(也不关心)我自己的ID,我的应用程序从它们收到的所有数据都是根据它们的ID(即我的表中的ExternalID)来识别的.

即客户端使用伪语言的请求就像"我是公司X,更新我的员工Y的数据".

我需要对CompanyID和Employees.ExternalID的组合强制执行唯一性,因此在我的数据库中,同一公司的员工不会有重复的ExternalID.

我在考虑3种可能的解决方案:

  1. 更改Employees的架构以包含CompanyID,并在两个字段上创建唯一约束.

  2. 强制执行触发器,在Employees中更新/插入时验证唯一性.

  3. 强制检查应用程序级别(即我的接收服务).

我的替代方案 - dbadmin-in-me sais(3)是最糟糕的解决方案,因为它不会在应用程序错误或其他情况下保护数据库不一致,并且很可能是最慢的.

触发器解决方案可能是我想要的,但它可能会变得复杂,特别是如果需要在单个语句中执行多个插入/更新,并且我不确定性能与(1).

并且(1)看起来是最快速和最简单的方法,但有点违背我对关系模型的理解.

SO DB专家对每种方法的利弊有何看法,特别是如果有可能增加额外的间接水平 - 即公司 - >办公室 - >部门 - >员工,同样的独特性需要保留(公司职员).

mysql sql database database-design data-modeling

5
推荐指数
1
解决办法
1213
查看次数

Postgres:一张多列的表还是几张少列的表?

我的问题与 Postgres 的工作原理有关:

我有一张桌子:


CREATE TABLE A (
   id SERIAL,  
   name VARCHAR(32),
   type VARCHAR(32) NOT NULL, 
   priority SMALLINT NOT NULL,
   x SMALLINT NOT NULL,
   y SMALLINT NOT NULL,
   start timestamp with time zone,
   end timestamp with time zone,
   state Astate NOT NULL,
   other_table_id1 bigint REFERENCES W,
   other_table_id2 bigint NOT NULL REFERENCES S,
   PRIMARY KEY(id)
); 
Run Code Online (Sandbox Code Playgroud)

在 other_table_id1、state 和 other_table_id2 上附加索引。

该表非常大,并且在列上看到了很多更新:other_table_id1、state。开始和结束列的一些更新,但其余的都是不可变的。(Astate 是列状态的枚举类型。)

我想知道将两个最常更新的列拆分到一个单独的表中是否有意义。我希望获得的是性能,因为当我只是查找该信息时,或者减少更新的权重,因为(也许?)读取和写入较短的行成本较低。但是,当(偶尔)需要一次性获得特定项目的所有数据时,我需要将其与连接成本进行权衡。

有一次,我的印象是每一列都是单独存储的。但是后来,当我在某处读到减少表格一侧列的宽度确实会对使用另一列查找数据时的性能产生积极影响时,我修改了我的想法(因为该行存储在一起,因此总行长度将更短)。所以我现在的印象是一行的所有数据都物理存储在磁盘上;所以提议的表格拆分听起来会很有帮助。当我当前写入 4 个字节来更新状态时,我是否相信我正在重写实际上从未改变的 64 个字节的文本(名称、类型)?

我对表“规范化”不是很熟悉,也不熟悉 Postgres 的内部结构,所以我正在寻找建议和 esp 最佳实践来估计权衡,而不必先做工作,然后确定这项工作是否值得. 这种变化需要相当多的努力来重写已经高度优化的查询,所以我宁愿深入了解我可以期待什么结果。谢谢,M。

sql postgresql database-design data-modeling

5
推荐指数
1
解决办法
4084
查看次数

是否有通用/标准/接受的方式来建模 GPS 实体(航点、轨迹)?

这个问题与地理空间信息系统的知识有些重叠,但我认为它属于这里而不是 GIS.StackExchange

有很多应用程序处理具有非常相似对象的 GPS 数据,其中大多数由GPX 标准定义。这些对象将是路线、轨迹、航点等的集合。一些重要的程序,如 GoogleMaps,以 KML 格式或多或少地序列化相同的实体。有许多其他在线地图应用程序(ridewithgps、strava、runkeeper,仅举几例)以不同的方式处理此类数据,但允许或多或少地对数据进行等效的“操作”。这些操作的示例是:

  • 用鼠标直接操作轨迹/轨迹点(包括在地图上绘制);
  • 基于时间和/或距离的合并和拆分;
  • 用 DEM/SRTM 高程替换 GPS 收集的高程;
  • 计算轨道部分的属性(总上升、平均速度、距离、经过的时间);

有一些小型库(如GpxPy)尝试对这些对象及其方法进行建模,以理想情况下允许封装的、可能与语言无关的库/API 的方式。

事实是:这个问题存在的时间足够长,足以让“普遍接受的标准”出现,不是吗?另一方面,大多数 GIS 软件非常专业地面向地理空间分析、地形和制图应用程序,而典型的旅行记录和旅行计划应用程序似乎更面向消费者爱好者,这可能解释了不同的分散方式项目/应用程序处理和建模问题。

因此,考虑到所有所说的,问题是:目前或正在计划中,是否有一种标准方法可以以面向对象的方式对最常用的 GPS/Tracklog 实体及其规范属性和方法进行规范建模?

有 GPX 模式,它非常接近我的想象,但它只包含对象和属性,不包含方法。

任何信息将不胜感激,谢谢!!

language-agnostic oop gps data-modeling

5
推荐指数
1
解决办法
1992
查看次数