Questions tagged «database-design»

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


2
在Google BigTables(和其他集成数据库)上进行性能测试
有哪些有效的方法可以对数据库操作执行程序性能测试,尤其是在数据库本身不提供专用工具的环境中? 例如,在Google App Engine中,整个页面加载被评估为一项操作,其中可能包括特定的数据库操作。SQLite和其他集成DB中也可能出现此问题。由于很难完全抽象出需要测试的(等效)选择和插入内容,是否有推荐的数据库工具对这些类型的查询执行更彻底的诊断?

2
在SQL中实现具有总参与约束的多对多关系
我应该如何在SQL中实现以下实体关系图所示的方案? 如图所示,每个A实体类型出现都必须与至少一个 B对应项(由双连接线指示)相关,反之亦然。我知道我应该创建以下三个表: CREATE TABLE A ( a INT NOT NULL, CONSTRAINT A_PK PRIMARY KEY (a) ); CREATE TABLE B ( b INT NOT NULL, CONSTRAINT B_PK PRIMARY KEY (b) ); CREATE TABLE R ( a INT NOT NULL, b INT NOT NULL, CONSTRAINT R_PK PRIMARY KEY (a, b), CONSTRAINT …

4
如何处理可变列的表设计
我有一个表设计方案,作为非DBA类型,我想就哪种方案更具可扩展性提出意见。 假设您被要求在都市圈的房屋上记录信息,从一个小社区(200座房屋)开始,但最终增长到5000000多个房屋。 您需要存储以下基本信息:ID#(可以用作唯一索引的唯一批号),Addr,City,State,Zip。很好,简单的表可以处理它。 但是每年,都将要求您记录有关所有房屋的额外信息-信息将每年更改。因此,例如,在第一年,要求您记录所有者的姓氏和平方英尺。第二年,要求您保留姓氏,但丢弃平方英尺,而是开始收集所有者的名字。 最后-每年,额外列的数量都会改变。可能从2个额外的列开始,然后在明年移至6,然后回落至2。 因此,一种表方法是尝试将自定义信息添加为房屋表中的列,因此只有一个表。 但是我有一种情况,有人为此安排了桌子: “房屋表”列:ID,地址,城市,州,邮政编码-每个房屋只有一行 ID Addr City State Zip ------------------------------------------- 1 10 Maple Street Boston MA 11203 2 144 South Street Chelmsford MA 11304 3 1 Main Avenue Lowell MA 11280 “自定义信息表”列:ID,名称,值-表如下所示: ID Name Value 1 Last Name Smith 2 Last Name Harrison 3 Last Name …

2
使用的列大小比必要的大得多
我正在与其他人创建SQL Server数据库。其中一张表很小(6行),数据可能保持不变。极有可能会添加新行。该表如下所示: CREATE TABLE someTable ( id int primary key identity(1,1) not null, name varchar(128) not null unique ); INSERT INTO someTable values ('alice', 'bob something', 'charles can dance', 'dugan was here'); 我正在查看该name列的char长度,并且我认为它的值可能永远不会大于,例如32个字符,甚至可能不大于24个字符。我将此列更改为,例如,varchar(32)? 另外,将默认列大小保持为4、8、32等的倍数是否有任何优势?

2
非整数主键注意事项
语境 我正在设计一个数据库(在PostgreSQL 9.6上),该数据库将存储来自分布式应用程序的数据。由于应用程序的分布式性质,SERIAL由于潜在的竞争条件,我不能使用自动增量整数()作为主键。 自然的解决方案是使用UUID或全局唯一标识符。Postgres带有内置UUID类型,非常适合。 UUID存在的问题与调试有关:这是一个非人类友好的字符串。标识符ff53e96d-5fd7-4450-bc99-111b91875ec5什么都没告诉我,而ACC-f8kJd9xKCd虽然不能保证唯一,但告诉我我正在处理一个ACC对象。 从编程的角度来看,调试与几个不同对象相关的应用程序查询是很常见的。假设程序员错误地ACC在ORD(order)表中搜索(account)对象。使用人类可读的标识符,程序员可以立即识别问题,而在使用UUID时,他将花费一些时间来找出问题所在。 我不需要UUID的“保证”唯一性;我确实需要一些空间来生成没有冲突的密钥,但是UUID太过分了。同样,在最坏的情况下,如果发生冲突(数据库拒绝它并且应用程序可以恢复),也不会是世界末日。因此,考虑到折衷,较小但对人类友好的标识符将是我的用例的理想解决方案。 识别应用程序对象 我想出的标识符具有以下格式:{domain}-{string},其中{domain}用对象域(帐户,订单,产品)代替,并且{string}是随机生成的字符串。在某些情况下,甚至可能{sub-domain}在随机字符串之前插入一个。让我们忽略的长度{domain},并{string}为保证唯一性的目的。 如果该格式有助于索引/查询性能,则可以具有固定大小。 问题 知道: 我想使用类似格式的主键ACC-f8kJd9xKCd。 这些主键将成为几个表的一部分。 所有这些键都将在6NF数据库上的多个联接/关系中使用。 大多数表的大小将为中到大(平均约100万行;最大的约1亿行)。 关于性能,什么是存储此密钥的最佳方法? 以下是四种可能的解决方案,但是由于我对数据库的经验很少,因此我不确定哪种数据库(最好)是最好的。 考虑的解决方案 1.存储为字符串(VARCHAR) (Postgres CHAR(n)和和之间没有区别VARCHAR(n),因此我忽略了CHAR)。 经过一些研究,我发现,与的字符串比较VARCHAR(特别是在join操作上)比使用慢INTEGER。这是有道理的,但是我应该在这种规模上担心吗? 2.存储为二进制(bytea) 与Postgres不同,MySQL没有本机UUID类型。有几篇文章解释了如何使用16字节BINARY字段而不是36 字节字段来存储UUID VARCHAR。这些帖子使我想到了将密钥存储为二进制文件(bytea在Postgres上)。 这样可以节省大小,但我更关心性能。我很少能找到解释比较快速的解释:二进制或字符串比较。我相信二进制比较会更快。如果是的话,那么即使程序员现在每次必须对数据进行编码/解码,也bytea可能比更好VARCHAR。 我可能是错的,但我认为两者bytea并VARCHAR会(通过文字或文字),由字节比较(平等)字节。有没有一种方法可以“跳过”此逐步比较,而只是比较“整个过程”?(我不这么认为,但是不进行成本检查)。 我认为按原样存储bytea是最好的解决方案,但是我想知道是否还有其他选择我会忽略。此外,我在解决方案1上表达的同样担忧仍然成立:比较开销是否足以让我担心? “创意”解决方案 我想出了两个非常有效的“创意”解决方案,但我不确定在什么程度上使用(即,如果我无法将它们扩展到表中的几千行)。 3.储存为,UUID但附有“标签” 不使用UUID的主要原因是,程序员可以更好地调试应用程序。但是,如果我们可以同时使用两者:数据库将所有键UUID仅存储为s,但是在进行查询之前/之后包装对象。 例如,程序员要求ACC-{UUID},数据库将忽略ACC-零件,获取结果,然后将所有结果返回为{domain}-{UUID}。 对于某些带有存储过程或函数的黑客来说,这也许是可能的,但是我想到了一些问题: 这(在每个查询中删除/添加域)是否会产生大量开销? 这有可能吗? 我以前从未使用过存储过程或函数,因此不确定是否可能。有人可以照亮吗?如果我可以在程序员和存储的数据之间添加一个透明层,那似乎是一个完美的解决方案。 4.(我的最爱)存储为IPv6 cidr 是的,你没有看错。事实证明,IPv6地址格式完美解决了我的问题。 我可以在前几个八位位组中添加域和子域,并使用其余的作为随机字符串。 该碰撞几率都OK。(虽然我不会使用2 ^ 128,但仍然可以。) 平等比较(希望)得到了优化,所以我可能会比简单地使用获得更好的性能bytea。 实际上,我可以执行一些有趣的比较,例如contains,具体取决于域及其层次结构的表示方式。 例如,假设我使用代码0000来表示域“产品”。密钥0000:0db8:85a3:0000:0000:8a2e:0370:7334将代表产品0db8:85a3:0000:0000:8a2e:0370:7334。 这里的主要问题是:与相比bytea,使用cidr数据类型有什么主要的优点或缺点?

1
为具有多个多对多关系的视频游戏业务领域设计数据库
我对数据库设计比较陌生,因此决定创建自己的假设数据库进行实践。但是,我难以建模和规范化它,因为我认为存在许多多对多(M:N)关系。 一般方案说明 该数据库旨在保留有关在Zelda系列上工作过的各种人员的数据。我想跟踪的控制台(S) ,一个游戏可以玩上,员工是曾在部分游戏的发展,乔布斯的员工有(很多员工在不同的工作职位在多个游戏等) 商业规则 多个员工可以从事多个游戏。 多个游戏可以在同一控制台上。 多个控制台可以是同一游戏的平台。 多个雇员可以具有相同的工作。 一个雇员可以有多个工作。 一个游戏可以有多个雇员。 一个游戏可以有多种类型的乔布斯在它的发展 多个游戏可以附加相同类型的作业。 一个控制台可以有多个人做这个工作。 一个人可以在多个控制台上工作。 属性名称和样本值 员工姓名,可以分成第一和最后(例如“约翰”和“李四”) 游戏标题(例如“时间之笛”) 职务(例如“关卡设计”,“导演”,“沉着”,“关卡设计师”,“程序员”,“本地化”等)。 控制台名称(例如“ Game Boy Advance”) 问题 到目前为止,无论我设计什么,似乎到处都存在感兴趣的实体类型之间的数据冗余和M:N关系。但是,我认为数据库设计人员必须始终遇到这种问题,因此必须找到解决方案。 注意:我很容易找到填充表的数据,问题是将其组织到具有标准化表格的数据库中。

4
区块链(比特币)作为数据库?
我正在阅读此BBC新闻文章和以下摘录,引起了我的注意。听起来像“ 永远在线”可用性组或“ 高可用性镜像”,也许自动包含了安全性。 区块链是否可能成为现代,高交易量应用程序的潜在数据库解决方案? 很容易看出它对于诸如个人病历之类的小额交易的价值,但是大容量数据库又如何呢? 什么是区块链? 区块链依靠密码学来允许一组计算机在不需要中央参与者的情况下对全局记录进行更改。 取消中间商可以减少几乎每个部门的成本。 区块链是一个分类账,按时间顺序或“链”记录发生在称为“块”的数据集合中的所有事件。 作为一种货币,这是一个重要的功能,因为它使用户可以确保自己的数字货币是一种,就像钱包中每个钞票的唯一性一样。 “区块链技术将成为我们创造资产的方式,因为它使您无需复制即可传输数字信息,”建设区块链网络的Chain.com首席执行官亚当·卢德温(Adam Ludwin)说。 区块链可用于跟踪各种信息的历史并保持其价值,例如,医生可以使用它来更新病历。 由于对区块链的每次更改都是在整个网络中同时进行的,因此不会丢失任何信息,并且由于无法撤消更改,系统将保持其透明性。需要一个特殊的密钥来更改每个块,因此个人可以通过保护该密钥来保护其记录安全。

4
在数据库中存储公交路线
我进行了一些研究,发现应该将路线存储为停靠点序列。就像是: Start -> Stop A -> Stop B -> Stop C -> End 我创建了三个表: 路线 停止 路线停靠点 ...其中RouteStops是联结表。 我有类似的东西: 路线 +---------+ | routeId | +---------+ | 1 | +---------+ | 2 | +---------+ 车站 +-----------+------+ | stationId | Name | +-----------+------+ | 1 | A | +-----------+------+ | 2 | …

2
多对多和弱实体
我有一个不能被另一个定义的实体,并且我希望这个实体参与多对多关系。 示例:一个艺术家有一个专辑(没有艺术家就不能存在该专辑),该专辑也有许多曲目,但是同一首曲目可以存在于许多专辑中。 因此,专辑和曲目之间存在多对多的关系。 如果专辑是一个弱实体,则它的主键是引用艺术家的外键,因此它不能是代表多对多关系的另一个表的外键。 问题是:在SQL中是否可能有这种关系,如果是这样,我该如何表达呢?

6
数据库规范化已死吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 已关闭6年。 我从小就读过-我们学会了在应用程序的业务层之前设计数据库架构(或使用OOAD进行其他所有操作)。我在设计模式(IMHO :)方面一直做得很好,并且进行规范化只是为了删除不必要的冗余,而没有在影响速度的地方进行标准化,即,如果联接对性能造成了影响,则冗余就留在了原处。但大多数情况并非如此。 随着一些ORM框架(如Ruby的ActiveRecord或ActiveJDBC)的出现(还有我不记得的其他几个,但是我敢肯定有很多),似乎他们更喜欢为每个表使用代理键,即使有些表具有主键,例如'电子邮件'-彻底破坏2NF。好的,我了解不多,但是当其中一些ORM(或程序员)不承认1-1或1-0 | 1(即1到0或1)时,我(几乎)感到不安。他们规定,最好将所有内容都放在一张大桌子上,而不管它是否有大量的nulls “当今系统可以处理它”,这是我经常听到的评论。 我同意内存限制确实与规范化有直接关系(还有其他好处:),但是在 当今廉价的内存和四核计算机的时代,DB规范化的概念是否留给文本?作为DBA,您是否仍在对3NF(如果不是BCNF :)进行标准化?有关系吗?“脏模式”设计是否适合生产系统?如果仍然有意义,应该如何为“归一化”提出理由。 (注意:我不是在谈论数据仓库的星型/雪花模式,这种模式作为设计的一部分/需求是冗余的,但是带有后端数据库(例如StackExchange)的商业系统)

7
这些表设计中哪一个对性能更好?
我被要求创建一些东西来跟踪每天在帐户上收取的费用,而我正在尝试找出一个支持此目的的数据库表模式。 这就是我所知道的 公司拥有超过250万个帐户 其中,他们目前平均每月工作200,000(随着人员配备水平的变化而变化,目前水平很低) 他们想跟踪13种不同的费用类型,并且警告说,将来可能会增加更多的费用 他们希望每天跟踪费用 成本不会在整个库存中分配。它们可以分为每月工作的帐户数量(200,000),或者用户可以输入帐户标识符以将成本应用于一组帐户,或者可以仅指定将成本应用于哪个帐户。 我首先想到的是规范化的数据库: 帐户ID 日期 CostTypeId 量 我的问题是数学。该表将迅速变得庞大。假设所有13种成本类型都应用到了当月的所有工作帐户,即每月200k * 13 * N days in month大约75-8000万条记录,或者每年接近10亿条记录。 我的第二个想法是将其标准化 帐户ID 日期 总计花费 CostType1 CostType2 CostType3 CostType4 CostType5 CostType6 CostType7 CostType8 CostType9 CostType10 CostType11 CostType12 CostType13 此方法更加不200k * N days in month规范,每月最多可以创建600万条记录(),或每年大约7200 万条。它比第一种方法少很多,但是,如果公司将来决定使用新的费用类型,则需要添加另一个数据库列。 在这两种方法中,您更喜欢哪一种?为什么?您是否可以想到另一种更好的选择? 我最感兴趣的是报告性能,包括总结报告和详细报告。当没有人在附近时,将费用分摊到各个帐户的工作将每晚进行。第二个问题是数据库大小。现有的数据库已经接近300GB,我相信磁盘上的空间约为500GB。 该数据库是SQL Server 2005

2
设计数据库和表以保留更改记录的最佳方法?
我需要在项目上设置历史记录功能,以跟踪先前的更改。 假设我现在有两个表: NOTES TABLE (id, userid, submissionid, message) SUBMISSIONS TABLE (id, name, userid, filepath) 示例:我在注释中有一行,并且用户想要更改消息。我想跟踪更改之前和更改之后的状态。 在这些表中的每个表上设置一列的最佳方法是什么,该列将说明某项是否“旧”。0,如果活性OR 1,如果删除/不可见。 我还想创建一个历史记录(AUDIT TRAIL)表,其中包含id先前状态的,id新状态的,这些ID与哪个表有关?

2
空列可以成为主键的一部分吗?
我正在开发一个SQL Server 2012数据库,并且对一个一对零或一个关系存在疑问。 我有两个表,Codes和HelperCodes。一个代码可以具有零个或一个辅助代码。这是用于创建这两个表及其关系的sql脚本: CREATE TABLE [dbo].[Code] ( [Id] NVARCHAR(20) NOT NULL, [Level] TINYINT NOT NULL, [CommissioningFlag] TINYINT NOT NULL, [SentToRanger] BIT NOT NULL DEFAULT 0, [LastChange] NVARCHAR(50) NOT NULL, [UserName] NVARCHAR(50) NOT NULL, [Source] NVARCHAR(50) NOT NULL, [Reason] NVARCHAR(200) NULL, [HelperCodeId] NVARCHAR(20) NULL, CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED ( …

3
用MySQL实现版本控制系统
我知道这里和这里都曾有人问过这个问题,但是我有相同的想法,但可能的实现方式有所不同,我需要一些帮助。 最初,我的blogstories表具有以下结构: | Column | Type | Description | |-----------|-------------|------------------------------------------------| | uid | varchar(15) | 15 characters unique generated id | | title | varchar(60) | story title | | content | longtext | story content | | author | varchar(10) | id of the user that originally wrote the …

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.