Questions tagged «database-design»

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

4
SSD是否会降低数据库的实用性
我今天只听说过罗伯特·马丁(Robert Martin),看来他是软件界的佼佼者,所以我的意思不是要让我的头衔看起来像是点击诱饵,或者是我在他口中吐槽,但这仅仅是我以有限的经验和理解来解释我从他那里听到的信息。 我今天正在观看视频(关于软件体系结构),在Robert C. Martin的演讲中,在视频的后半部分,数据库主题是主要焦点。 根据我对他所说内容的理解,似乎他在说固态硬盘会降低数据库的实用性(相当可观)。 要解释我是如何进行这种解释的: 他讨论了使用HDD /旋转磁盘如何缓慢地检索数据。但是,这些天我们使用SSD。他以“ RAM即将到来”开始,然后继续提及RAM磁盘,但随后说他不能称其为RAM磁盘,因此只能说RAM。因此对于RAM,我们不需要索引,因为每个字节花费相同的时间来获取。(本段由我解释) 因此,他建议使用RAM(例如计算机内存中的内存)来代替数据库(因为这就是我解释他的声明的意思)没有任何意义,因为这就像说所有记录在应用程序的生命周期内都是在内存中处理的(除非您根据需要从磁盘文件中提取) 因此,我求助于RAM,他的意思是SSD。因此,在那种情况下,他说固态硬盘会降低数据库的实用性。他甚至说:“如果我是Oracle,我会感到害怕。我之所以存在的根本基础正在消失。” 从我对SSD的了解很少,不像HDD那样需要O(n)寻道时间(我认为),SSD接近O(1)或几乎是随机的。因此,他的建议对我来说很有趣,因为我从未想过。几年前,当我第一次被介绍给数据库时,一位教授描述了常规文件系统所没有的好处,我得出结论,数据库的主要作用本质上是一个索引很高的文件系统(以及优化,缓存,并发访问,等等),因此,如果SSD中不需要索引,这种方法会使数据库的使用率降低。 不管怎么说,以我是新手开头,我很难相信它们变得没有用,因为每个人仍然使用DBs作为其应用程序的主要观点,而不是纯文件系统,并且觉得他过于简化了。数据库的作用。 注意:我一直观察到最后,以确保他没有说不同的话。 供参考:42 : 22是整个数据库主题出现的时间, 43:52是他以“为什么还要拥有数据库”开始的时间 这个答案确实表明SSD大大提高了DB的速度。 此问题询问如何更改优化。 对于TL; DR,我的问题是,服务器市场上广泛使用SSD的出现(无论即将到来还是已经发生)是否会降低数据库的实用性? 似乎演示者试图传达的是,使用SSD,人们可以将数据存储在磁盘上,而不必担心像旧版HDD以及SSD一样检索数据的速度会很慢。O(1)(我认为)。因此,如果这是真的,那么假设会失去它的优势之一:建立索引,因为拥有索引以缩短查找时间的优势已荡然无存。

1
带有索引的JSONB与hstore
在此阶段,我试图以尽可能少的假设(关于Web应用程序实际如何演变)来决定数据库设计。 第一步,了解JOINS昂贵,因此我考虑使用少量的整体表,而不是大量的规范化较小表。第二点,我对使用hstore与常规表与JSONB(具有GiST索引)之间感到困惑。 AFAIK(请随时纠正): 通常,在Postgres中,已知hstore的性能要优于其他数据类型。FOSDEM PGDAY的演示文稿有一些有趣的统计数据(在幻灯片的下半部分)。 https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf hstore的一个优点是快速索引(GiN或GiST)。但是,使用JSONB,GiN和GiST索引也可以应用于JSON数据。 来自第二象限专家的博客说:“这时可能值得在所有新应用程序中用jsonb替换hstore使用”(滚动到最后):http ://blog.2ndquadrant.com/postgresql-anti-patterns-unnecessary -jsonhstore-dynamic-columns / 因此,我想决定以下几点: 对于数据的主要(结构化)部分:它应该放在几个关系表中(相对较大,有很多列),还是应该是使用hstore的许多键值存储? 对于临时(用户提供的/非结构化的)数据,应该将其存储在JSON中还是将其存储在hstore中(存储在主要关系表之一中)?

6
在表中任意排序记录
使用数据库时,通常需要按顺序访问记录。例如,如果我有一个博客,我希望能够以任意顺序重新排列我的博客文章。这些条目通常具有很多关系,因此关系数据库似乎很有意义。 我见过的常见解决方案是添加一个整数列order: CREATE TABLE AS your_table (id, title, sort_order) AS VALUES (0, 'Lorem ipsum', 3), (1, 'Dolor sit', 2), (2, 'Amet, consect', 0), (3, 'Elit fusce', 1); 然后,我们可以对行进行排序,order以使其按正确的顺序排列。 但是,这似乎很笨拙: 如果我想将记录0移到开头,则必须对每个记录重新排序 如果我想在中间插入新记录,则必须对每个记录重新排序 如果要删除记录,则必须对它之后的每个记录重新排序 很容易想到这样的情况: 两个记录具有相同的 order order记录之间存在差距 这些可能很容易发生,原因有很多。 这是Joomla之类的应用程序采用的方法: 您可能会争辩说这里的界面很糟糕,他们应该使用箭头或拖放操作来代替人类直接编辑数字,而您可能是正确的。但是在幕后,发生了同样的事情。 有人建议使用小数来存储顺序,以便您可以使用“ 2.5”将记录插入顺序为2和3的记录之间。虽然这样做有所帮助,但可以说它甚至更麻烦,因为您最终会得到奇怪的小数点(您在哪里停止?2.75?2.875?2.8125?) 有没有更好的方法将订单存储在表中?

3
表分区有何帮助?
我很难掌握表分区的优缺点。我即将开始一个有8个表的项目,其中一个将是主要数据表,其中将包含180-2.6亿条记录。由于将对表进行正确的索引,因此我正在考虑将表记录限制为2000万,这样我就必须创建9-13个表。 但是我不确定如何提高性能,因为它们将位于同一台计算机(32GB RAM)上? 我正在使用MySQL,表将是MyISAM,大表将在id字段上具有索引,并且没有进一步的复杂性,例如全文搜索等。 还请阐明表分区与数据库分区。

20
如何进入一个丑陋的数据库?
我敢肯定你们中的许多人/正在处理一个丑陋的数据库。您知道,该数据库根本没有进行标准化,您必须在其中进行大量痛苦的查询才能获得最琐碎的数据,该数据库正在生产中并且您无法进行任何更改...您知道, “那个”。 我的问题是,您如何处理? 您是否尝试建立新数据库? 你放弃,让它一个人呆着吗? 您能提供什么建议?

2
在多租户数据库体系结构中处理越来越多的租户
对于每个租户的应用程序实例,在具有单独数据库的公共服务器中处理少量客户(租户)相对简单,通常是正确的方法。目前,我正在研究每个租户都有自己的数据库实例的应用程序的体系结构。 但是,问题在于此应用程序将具有大量的租户(5,000-10,000),并且用户数量很多,单个租户可能为2,000。我们将需要支持每周由几个租户扩展该系统。 此外,将为所有租户及其用户提供一个通用的登录过程(即每个租户不能拥有自己的URL)。为此,我需要一个集中的登录过程以及一种将数据库动态添加到系统并注册用户的方法。 如何可靠地自动化注册和数据库创建过程? 是在系统上创建和注册租户数据库的过程可能会导致性能或锁定问题吗?如果您认为这可能是一个问题,那么有人可以建议减轻它的方法吗? 如何以一种将用户凭据与特定租户的数据库关联但用户可以通过公共页面登录(即全部通过相同的登录URL,但他们的家庭应用程序将位于某个特定租户的数据库中)的方式管理集中身份验证)。租户必须能够维护自己的登录名和权限,但是中央登录系统必须知道这些。有人可以建议一种方法吗? 如果我需要通过添加多个数据库服务器来“横向扩展”,那么有人可以建议我管理跨服务器的用户身份(模拟等)时可能要处理的问题以及减轻这些问题的某种方法吗?

2
如何将IS-A关系映射到数据库?
考虑以下: entity User { autoincrement uid; string(20) name; int privilegeLevel; } entity DirectLoginUser { inherits User; string(20) username; string(16) passwordHash; } entity OpenIdUser { inherits User; //Whatever attributes OpenID needs... I don't know; this is hypothetical } 不同类型的用户(直接登录用户和OpenID用户)显示IS-A关系。即,两种类型的用户都是用户。现在,有几种方法可以在RDBMS中表示: 方式一 CREATE TABLE Users ( uid INTEGER AUTO_INCREMENT NOT NULL, name VARCHAR(20) …

7
长列如何影响性能和磁盘使用率?
在我们当前的项目中,它经常发生,我们需要将列扩展几个字符。从varchar(20)到varchar(30)等等。 实际上,这到底有多重要?优化效果如何?正常的“输入”字段只允许100或200甚至500个字符的影响是什么?一封电子邮件只能包含320个字符,所以好吧-那里有一个很好的限制。但是,如果将其设置为200,我会得到什么,因为我希望电子邮件地址不会超过此数目。 通常,我们的表的行数不超过100.000,最多不超过20或30列。 我们现在使用SQL Server 2008,但是了解不同的DB如何处理此问题将很有趣。 如果影响非常小-就像我期望的那样,这将有助于获得一些好的论据(通过链接进行备份?)来说服我的DBA,这种长距离偏执并不是真正必要的。 如果是这样,我在这里学习:-)

4
我应该明确拒绝不应该更新的列吗?
我习惯在非常安全的环境中工作,因此我将权限设计为非常精细。我通常要做的一件事是显式地DENY使用UPDATE不应该更新的列的功能。 例如: create table dbo.something ( created_by varchar(50) not null, created_on datetimeoffset not null ); 设置值后,永远不要更改这两列。因此,我明确DENY了UPDATE他们的权限。 最近,在一个团队会议中,开发人员提出了一个观点,即确保字段永远不会更新的逻辑应该包含在应用程序层而不是数据库层中,以防“他们出于某种原因需要更新值”。对我来说,这听起来像是典型的开发者心态(我知道,我曾经是一个!) 我是公司的高级架构师,我一直致力于使应用程序正常运行所需的最少特权。所有权限都会定期审核。 在这种情况下,最佳做法是什么?

4
是否为不同的产品类型创建单独的表?
我正在设计数据库,并且对我的最初设计决策有第二个想法... 产品类型如下...型号,零件,替换零件套件和选件。 选项A(第一种设计):我计划为上述产品类型提供单独的表格。我想说每个表中大约75%的字段是相同的。 由于需要在每个产品类型之间创建关联,因此我将它们创建为单独的表格。例如,一个模型可以有很多选项,而一个选项可以有很多模型。一个选项也可以有很多部分,而一个部分可以有很多选择...等等。 选项B:除了创建单独的表格外,我还可以创建一个名为Product的表格,其中包含模型,零件,备件套件和选件。我可以使用一个称为类型的字段来区分模型,选项等。我认为不利的一面是,某些产品类型永远不会使用多个字段(留空)。我猜这就是“最佳实践”发挥作用的地方。 选项B将大大降低数据库设计的复杂性。在提取查询数据时,我也不必担心引用一堆表...

7
储存IP位址
我必须将所有注册用户的IP地址存储在数据库中。我想知道,我应该为该列声明多少个字符? 我也应该支持IPv6吗?如果是,那么IP地址的最大长度是多少?

5
有什么方法可以在数据仓库中实现多对多关系?
数据仓库建模的主要拓扑(星型,雪花型)在设计时考虑了一对多关系。当面对这些建模方案中的多对多关系时,查询的可读性,性能和结构会严重下降。 有什么方法可以实现维度之间或事实表与数据仓库中的维度之间的多对多关系,它们在必要的粒度和查询性能方面会造成什么折衷?

3
在数据库中强制执行“至少一个”或“完全一个”的约束
假设我们有用户,每个用户可以有多个电子邮件地址 CREATE TABLE emails ( user_id integer, email_address text, is_active boolean ) 一些样本行 user_id | email_address | is_active 1 | foo@bar.com | t 1 | baz@bar.com | f 1 | bar@foo.com | f 2 | ccc@ddd.com | t 我要强制执行一个约束,即每个用户都只有一个活动地址。如何在Postgres中做到这一点?我可以这样做: CREATE UNIQUE INDEX "user_email" ON emails(user_id) WHERE is_active=true; 这样做可以防止用户拥有多个活动地址,但我相信不能防止其所有地址都设置为false。 如果可能的话,我宁愿避免使用触发器或pl / …

7
通过将街道地址分成多个单独的列可以解决哪些问题?
我们有一个团队为软件开发人员设计表格和关系。在我们的组织中,他们对执行3NF标准化非常严格-坦白地说,鉴于我们的组织规模以及需求或客户随时间的变化,我同意。我对他们的设计决定背后的原因只有一个不清楚的地方:地址。 虽然这主要针对美国的地址,但我认为这可以适用于任何这样做的国家。地址的每个部分在地址表中都有自己的列。例如,以这个肮脏的美国地址为例: Attn: Jane Doe 485 1/2 N Smith St SW, APT 300B Chicago, IL 11111-2222 它会像这样在数据库中拆分: 街道号:485 街道分数:1/2 街道定向:N(北) 街道名称:史密斯 街道类型:ST(街道) 街后:SW(西南) 城市:芝加哥 州:IL(伊利诺伊州) 邮政编码:11111 邮政编码:2222 国家(假设为美国) 注意:Jane Doe 邮政信箱:NULL 居住类型:APT(公寓) 居住人数:300B 并且还会有其他几列与乡村路线和合同路线相关。此外,我们的特定应用程序可能会包含一些国际地址。数据建模人员表示,他们将添加特定于国际地址的列,即通常的第1行,第2行字段。 起初我以为这太过分了。反复进行在线研究是指使用地址行1、2、3和可能的4,然后划分城市,地区和邮政编码。对于这种粒度很有用的新应用程序,我们确实有一个用例。我们必须验证用户没有创建重复业务,并且检查地址是验证之一。我们可以使其与地址线1和2一起使用,但这会更加困难。 对于我们的特定应用程序,我们需要为企业和个人存储多种地址(实体地址,邮件地址,运输地址等)。我们可能需要生成可打印的套用信函,但到目前为止尚未讨论该要求。 我们组织中的应用程序还需要支持其他一些功能: 审核(带有完整的历史记录表) 打印邮件标签 生成打印表格 报告(针对国家和地区政府) 虽然我们的应用程序可能无法像其他应用程序那样做所有事情,但是将地址拆分为多个组件是我工作的企业标准。无论我们的应用程序是否将从中受益,我们都被迫这样做。 半相关的StackOverflow问题:一个好的地址解析器在哪里被关闭,但是它说明了解析地址有多困难。 为了让我更好地了解他们的设计决策,并向我们的客户推销该想法... 将街道地址分为几列可以解决哪些问题? 对于实施了这样的系统的任何人,如果他们遇到了问题,就会获得加分。


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.