Questions tagged «database-design»

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

2
产品属性列表设计模式
我正在更新我们网站的产品数据库。它内置于MySQL中,但这更多是一个通用的数据库设计模式问题。 我打算切换到Supertype / Subtype模式。我们当前/以前的数据库主要是一个表,其中包含有关一种产品类型的数据。我们正在考虑将我们的产品范围扩展到包括不同的产品。 这个新的草稿设计是这样的: Product product_[type] product_attribute_[name] ---------------- ---------------- ---------------------------- part_number (PK) part_number (FK) attributeId (PK) UPC specific_attr1 (FK) attribute_name price specific_attr2 (FK) ... ... 我对产品属性表有疑问。这里的想法是产品可以具有给定属性的列表,例如颜色:红色,绿色,蓝色或材料:塑料,木材,铬,铝等。 该列表将存储在表中,并且该属性项的主键(PK)将在特定产品表中用作外键(FK)。 (Martin Fowler的书《企业应用程序体系结构的模式》称为“ 外键映射 ”) 这允许网站界面提取给定属性类型的属性列表,并将其吐入下拉选择菜单或其他UI元素中。该列表可以视为属性值的“授权”列表。 对我而言,拉出特定产品时最终发生的连接数量过多。您必须将每个产品属性表都连接到产品,以便获得该属性的字段。通常,该字段的名称可能仅仅是字符串(varchar)。 这种设计模式最终会创建大量表,并且最终会为每个属性提供一个表。解决此问题的一种方法是为所有产品属性创建更多的“抓包”表。像这样: product_attribute ---------------- attributeId (PK) name field_name 这样,您的表可能如下所示: 1 red color 2 blue color 3 chrome …

4
什么更好/更快?MySQL或文件系统?
假设一个网站是一个人的目录。对于每个人,可能会有个人资料照片和传记。 我承认我的SQL查询可能会更好,但总的来说会更快并且使用更少的处理能力。 要检查文件是否存在,然后将其打开或 检查MySql以查看生物是否存在并显示它。 我很确定在上述情况下,文件系统会占用mysql数据库。 如果我使数据库成为只读的分隔txt文件怎么办? 在这种情况下,什么更快? 如果txt文件中有太多记录,是否有某个特定点,最好使用MySql?


3
事实表外键为空?
我是数据集市设计的新手,需要清除一些概念。 我已经阅读了一些有关维建模的知识,在该模型中,事实表存储了对维表的外键引用。 现在假设我有一个电话号码维度表和一个phone_extension维度表。(这些表具有不同的详细信息,因此我无法将它们组合在一起) 据我了解,这两个维度表都将具有整数主键以获得更好的性能,事实表将具有其自己的整数主键,并且还存储对这些维度表的外键引用。 但是,假设我有一种情况,并非所有电话号码都有与之相关的phone_extension。(某些电话号码不需要加分机号) 对于具有扩展名的电话号码,事实表将同时具有两个维表的外键引用,但是如何捕获只有电话号码却没有扩展名的情况(反之亦然,即没有电话号码的扩展名) ? 我是否应该使用事实表中电话号码为FK且具有值且phone_extension外键为null的方式捕获此类信息?还是这些无关的对象没有记录在事实表中? 我还需要生成此数据集市的报告。那么,我是从查询事实表并检索维键值开始还是直接从维表中报告? 感谢您阅读本文的时间!! 感谢任何帮助!

1
太多的空闲连接会影响PostgreSQL 9.2的性能吗?
我的数据库服务器上的某些查询似乎需要很长时间才能响应,而且我认为CPU使用率很高。运行时ps aux,我看到约250个“空闲”连接(我认为数量太多)。我还没有开始做完整的诊断,但是我想知道这是否是一个开始寻找的好地方。 我还在事务级池中使用PgBouncer。我怀疑可以idle通过调整池大小来轻松减少连接数。但是,除非有充分的理由,否则我不想开始进行太多更改。 idlePostgreSQL 9.2中的许多连接会影响性能吗? 非常感谢!

3
如何更快地获得最近行的总数?
我目前正在设计交易表。我意识到将需要计算每一行的运行总计,这可能会降低性能。因此,出于测试目的,我创建了一个包含一百万行的表。 CREATE TABLE [dbo].[Table_1]( [seq] [int] IDENTITY(1,1) NOT NULL, [value] [bigint] NOT NULL, CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [seq] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO 我尝试获取10个最近的行及其运行总计,但大约花了10秒钟。 --1st attempt SELECT TOP 10 seq …

2
预测审查的数据库设计
我试图学习更多有关关系数据库的知识,并且发现没有更好的方法来学习然后实际去做。我决定亲自尝试一下“个人预算会计和预测”。到目前为止,我已经进行了一些研究,并希望对当前的数据库设计和规范化有一些了解。 您对我当前的数据库设计有何想法和建议?我在下面提供了一些信息,以便更好地帮助您:) 披露:这是一个个人项目。不用于家庭作业或工作。 商业事实 银行ACCOUNT可以有很多ENTRIES An ENTRY可以是CREDIT或DEBIT 的ENTRY日期已计入贷方或借方 安ENTRY有一个PAYEE 一个ENTRY可以被关联到BUDGET CATEGORY A CREDIT的金额为ENTRY A CREDIT的说明ENTRY 一个CREDIT可以在未来计划 A的CREDIT频率和/或金额可能会重复出现 A DEBIT的金额为ENTRY A DEBIT的说明ENTRY 一个DEBIT可以在未来计划 A的DEBIT频率和/或金额可能会重复出现 A PAYEE有个名字 一个BUDGET有很多BUDGET CATEGORIES A BUDGET只能与一个日历月份关联 一个BUDGET CATEGORY可以包含许多ENTRIES A BUDGET CATEGORY有个名字 A BUDGET CATEGORY有BUDGET金额 A FORECAST有开始日期 A FORECAST有结束日期 A FORECAST有期初余额 一个FORECAST有很多FORECASTED DAYS 一个FORECAST有一个FORECASTED BUDGET A FORECASTED DAY有一个日期 …

1
在单个表上使用多个唯一约束是否被认为是不良设计?
我查看了PostgreSQL的INSERT INTO .. ON CONFLICT (..) DO UPDATE ..语法并意识到,您不能使用它进行多个唯一的约束检查。我的意思是,您可以通过列名引用复合唯一索引ON CONFLICT (Name, Symbol)(如果为这两列定义了唯一索引),或者您可以使用主键。如果为列定义两个单独的唯一索引,则只能检查一个。 CREATE TABLE student (Id int primary key, Name varchar(50), Symbol varchar(50), CONSTRAINT col1_unique UNIQUE (Name), CONSTRAINT col2_unique UNIQUE (Symbol) ); INSERT INTO student (Id, Name, Symbol) VALUES (1, 'John', 'J'), (2, 'David', 'D'), (3, 'Will', 'W'); INSERT INTO …

2
从生产中的表中删除列
我们有一种情况需要将2个表之间的关系从m:1更改为m:n。 因此,我们需要在这两个表之间创建一个交叉引用表。 将所有现有数据从“子”表迁移到交叉引用表后,删除子表中的原始外键列不是一个好主意吗? 如果我们把它留在那儿,基本上就是技术债务。但是我不是dba,也不太了解从表中删除列的含义。(我知道这是可能的,但这是一个坏主意吗?我的数据库会为此讨厌我吗?) 谢谢

1
重新设计大量传感器数据的存储
我受命实施/重新设计一个解决方案,该解决方案将存储来自传感器阵列的天气数据。该阵列将由约40个塔组成,每个塔均带有约10个传感器,每个传感器将以10秒的间隔对大气状况进行采样,时间不确定(年)。此任务的一些应用程序和要求如下: 管理和检索塔/传感器配置,以进行数据分析。 通过传感器或时间间隔进行数据可视化以进行气象观测。 为客户提供可靠和持久的数据资源/数据集,以比较模型和传感器的性能(可能需要进行一些后处理才能以所需的格式交付?)。 注意:当前的解决方案(实现为概念证明,有5个塔)将数据存储为平面文件(每小时一个文件)。 我最初不确定将来是否会构成大数据问题,所以我研究了关系数据库和NoSQL数据库的两种解决方案,但是我觉得我需要更多指导,因为我不是数据管理专家。 我认为解决方案之一是将数据存储在按塔,传感器和时间戳编制索引的关系数据库中,并按日期对表进行分区。 另一个基于将来的扩展,是将其存储在文档类型的NoSQL数据库(如MongoDB)中,并模拟当前解决方案的结构。 这些好方法中有什么?如果没有,什么是更好/推荐的解决方案?另外,是否有必要重新设计当前解决方案?有人告诉我,使用平面文件的理由是,他们认为关系数据库会占用过多的开销。如果是这样,是否有办法避免这种情况?


4
并发团体预订的策略?
考虑一个座位预订数据库。有一个n个席位的列表,每个席位都有一个属性is_booked。0表示不是,1表示是。任何更高的数量,都有一个超额预订。 在不允许超额预定的情况下进行多笔交易(每笔交易将同时预订一组y个席位)的策略是什么? 我只需选择所有未预订的座位,从中随机选择一组y,然后全部预订,然后检查预订是否正确(也就是is_booked的数量未超过一个,这表示已预订了该座位的另一笔交易,提交),然后提交。否则中止并重试。 这在Postgres中的隔离级别Read Committed上运行。

1
“累积快照”事实表中的“测量类型尺寸”
我有一个累积的快照事实表,该表跟踪终端中容器的进入和退出。 容器可以以3种不同的方式进入和退出,因此我想创建一个特定的尺寸表,其中列出了这3种可能的方式(火车,轮船或卡车)。 然后我读了这篇文章,基本上说这种技术是错误的,但我不明白为什么。 第一篇文章: 有时,当事实表的一长串事实稀疏地填充在任何单独的行中时,它很想创建一个度量类型维度,以将事实表行折叠为由度量类型维度标识的单个通用事实。我们通常不建议这种方法。尽管它删除了所有空的事实列,但将事实表的大小乘以每行中已占用列的平均数,这使列内计算更加困难。当潜在事实的数量极高(数百个)时,此技术是可以接受的,但对于任何给定的事实表行,只有极少数适用。 我了解,如果为事务事实表实现了“ 度量类型维 ”,则可能会产生其他文章所述的问题,但是如果用于累积快照事实,我看不到任何不利之处。 第二篇文章:( 实现“度量类型维”的一些缺点) [...]如果我们使用“度量类型维”,我们将失去这种分析能力。如果一项措施与其他措施不兼容,我们将无法将其相加。 [...]我们的SQL运行以生成报告所需的传递次数越多,报告就越慢。 [...]在BI工具上,如果不放置度量类型过滤器,则可能会使用户冒着“垃圾信息”的危险。从可用性的角度来看,这种设计是垃圾。 对Mark Storey-Smith的回答 非常好的方法,我永远也不会想到。 另一件事:将集装箱带入码头的车辆的每次进出都有唯一的ID,该ID向我提供其他信息,例如:车辆的预计到达,实际到达,如果是码头的船只,如果是卡车,收费站以及许多其他信息... 这是3个不同的事实表,它们必须以某种方式链接到容器事实表。 我以为航行的ID是degenerate dimension,因此它将直接进入容器事实表。因此,我的疑问是:我应该在容器事实表中添加6个不同的字段(vessel_voyage_in_key,vessel_voyage_out_key,train_voyage_in_key,train_voyage_out_key,truck_voyage_in_key,truck_voyage_out_key)还是仅动态链接到各个表的其他2个字段(voyage_in,voyage_out)? 希望我的疑问很清楚,谢谢。

4
如何处理500M +项目的查询
我的数据结构如下: date: <timestamp> filter_a: <integer> -> range [0, 1000] filter_b: <integer> -> range [0, 1000] filter_c: <integer> -> range [0, 86400] filter_d: <integer> -> range [0, 6] group: <string> second_group: <integer> variable_a: <float> variable_b: <float> variable_c: <float> a couple more no very important 我需要执行以下查询: 第一: 通过筛选数据date,filter_a,filter_b,filter_c和其他人 其次,用过滤后的数据: 计算所有记录 得到平均的variable_a,variable_b并variable_c 得到标准差的variable_a,variable_b并variable_c …

3
如果带有代理键的表的列已知具有唯一的非空值(例如SSN),是否违反3NF?
据我了解,第三范式(3NF)基本上意味着应该只有一个密钥。 如果带有自动递增id列的表还具有一个已知唯一且不为空的列(例如,社会保险号),则该另一列可用作键。 从严格的架构设计方面,忽略实际/业务问题(例如,将SSN作为密钥/ FK传递时的安全性/隐私风险),由于有效地有2个密钥,这样的表是否不会出现在3NF中? 答案是否会在另一列上是否有唯一键上有所不同?如果是这样,为什么?

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.