问题标签 [database-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
14 回答
38358 浏览

sql - 实现软删除的最佳方法是什么?

目前正在处理一个项目,我们必须为大多数用户(用户角色)实施软删除。我们决定is_deleted='0'在数据库中的每个表上添加一个字段,并将其设置为'1'如果特定用户角色在特定记录上点击了删除按钮。

对于现在的未来维护,每个SELECT查询都需要确保它们不包含记录where is_deleted='1'

是否有更好的解决方案来实现软删除?

更新:我还应该注意到,我们有一个审计数据库,它跟踪应用程序数据库中所有表/字段的更改(字段、旧值、新值、时间、用户、ip)。

0 投票
10 回答
20126 浏览

database-design - SaaS 数据库设计 - 多个数据库?分裂?

我见过以许多不同方式托管的 SaaS 应用程序。跨多个数据库拆分功能和模块是个好主意吗?例如,将 User 表放在一个 DB 上,将功能/应用特定表放在另一个 DB 上,或者将其他常用共享表放在另一个 DB 上?

0 投票
5 回答
931 浏览

database-design - 重用软删除记录

如果我有一个表结构是:

code主键在哪里。

用户创建一条记录,然后将其删除。因为我使用的是软删除,所以isdeleted将设置为 true。然后在我的查询中,我将使用 where 子句进行选择and not isdeleted

现在,如果用户去创建一条新记录,他们可能会看到代码“ABC”不存在,因此他们尝试重新创建它。由于 where 子句,select 语句不会找到它。但是会出现主键索引错误。

是否应该允许用户重新使用记录?我认为不会,因为软删除的想法是保留对旧数据的查询记录,以便连接到“已删除”记录仍然有效。如果允许用户重新使用代码,那么他们可以更改描述,这可能会改变历史数据的视图。但是完全阻止他们使用该代码是否太苛刻了?

或者我应该使用完全隐藏的主键,然后可以重复使用“代码”字段?

0 投票
20 回答
1043 浏览

sql - 一旦数据在系统中,就修复糟糕的 BAD 数据库设计

我知道这不是一个问题……无论如何,这就是问题所在。

我继承了一个数据库,其中包含 1(一个)表,看起来很像这样。其目的是记录在各个(200 多个)国家发现的物种。

数据样本将是这样的

在我看来,这是典型的多对多情况,我想要 3 张桌子。物种、国家和物种FoundInCountry

链接表 (SpeciesFoundInCountry) 在物种和国家表中都有外键。

(很难画图!)

有没有一种神奇的方法可以生成一个插入语句,该语句将根据列名和原始巨型表中有 1 的 SpeciesID 从新的 Country 表中获取 CountryID?

我可以为一个国家做这件事(这是一个展示我想要的东西的选择)

(巨型表称为物种)

但是使用这种策略,我需要对原始表中的每一列进行查询。

有没有办法在sql中做到这一点?

我想我可以 OR 一堆我的 where 子句并编写一个脚本来制作 sql,虽然看起来不优雅!

有什么想法(或需要澄清)?

0 投票
7 回答
2234 浏览

database-design - 数据库设计查找表

我目前正在尝试改进遗留数据库的设计,我有以下情况

目前我有一个表 SalesLead,我们在其中存储 LeadSource。

潜在客户来源有用地存储在表格中。

所以我只想创建一个从一个到另一个的外键并删除非规范化列。

我希望所有标准的东西。

这是我的问题。我似乎无法摆脱这个问题,而不是写作

这是完全明确的,我现在必须写

或者

如果我们改变 LeadSource 字段的内容,就会中断。

在我的应用程序中,当我想更改 SalesLead 的 LeadSource 的值时,我不想从 1 更新到 2(例如),因为我不想让开发人员记住这些神奇的数字。id 是任意的,应该保持不变。

如何在我的应用程序代码中删除或否定对它们的依赖?

编辑我的解决方案必须支持的语言

  • .NET 2.0 + 3(对于它的价值 asp.net、vb.net 和 c#)
  • vba(访问)
  • 数据库 (MSSQL 2000)

编辑 2.0加入很好,只是 'foo' 可能会根据请求更改为 'foobar',我不想处理查询。

0 投票
38 回答
118334 浏览

database - 外键有什么问题?

我记得在播客 014中听到Joel Spolsky提到他几乎没有使用过外键(如果我没记错的话)。但是,对我来说,它们对于避免整个数据库中的重复和后续数据完整性问题似乎非常重要。

人们是否有充分的理由说明原因(以避免根据堆栈溢出原则进行讨论)?

编辑: “我还没有理由创建外键,所以这可能是我实际设置外键的第一个原因。”

0 投票
11 回答
3177 浏览

sql - 如何在我的数据库中强制执行数据完整性规则?

我正在设计这个类和抽象(MustInherit)类的集合......</p>

类图

这是我要存储所有这些的数据库表……</p>

数据库表

据 Microsoft SQL Server 数据库所知,这些都是可空的(“允许空值”)列。

但实际上,这取决于存储在那里的类:LinkNode、HtmlPageNode 或 CodePageNode。

规则可能看起来像这样......

规则表

如何在我的数据库中强制执行此类数据完整性规则?


更新:关于这个单表设计......

我仍在尝试将最终架构归零。

我最初从许多具有几乎为零的 nullalbe 字段的小表开始。
哪个是我导航的最佳数据库架构?

我了解了 LINQ to SQL IsDiscriminator 属性。
在 SQL 中处理一对一关系的最佳方法是什么?

但后来我了解到 LINQ to SQL 只支持单表继承。
LINQ to SQL IsDiscriminator 列不能继承吗?

现在我试图用一个类和抽象类的集合来处理它。
请帮助我处理我的 .NET 抽象类。

0 投票
11 回答
3180 浏览

ruby-on-rails - 我将如何存储一个可能是部分的日期(即只有年份,也可能是月份)并在以后以相同的特异性输出它?

我想让用户指定一个日期,该日期可能包括也可能不包括日期和月份(但至少有年份。)问题是当它作为日期时间存储在数据库中时;缺少的日期/月份将被保存为默认值,我将失去日期的原始格式和含义。

我的想法是将实际格式存储为除日期时间列之外的字符串。然后,每当我必须为其他所有内容显示日期和日期时间时,我都可以使用字符串列。缺点是我要显示的表中的每个日期列都有一个额外的列,并且打印本地化日期不会那么容易,因为我不能依赖日期时间值......我可能不得不解析字符串.

我希望我忽略了一些事情,并且可能有更简单的方法。

(请注意,如果它对解决方案很重要,我正在使用 Rails。)

0 投票
7 回答
5339 浏览

database - 在关系数据库中将用户表与人员表分离

我做过很多网络应用程序,你做的第一件事就是创建一个包含用户名、密码、姓名、电子邮件和所有其他常见问题的用户表。我目前的项目提出了一种情况,即非用户记录需要与用户类似的功能,但不需要成为一阶用户的能力。

创建第二个表是否合理people_tb,即主关系表和数据存储,并且仅使用users_tb用于身份验证?分离是否user_tb存在people_tb任何问题?如果通常这样做,有哪些策略和解决方案以及缺点?

0 投票
23 回答
31453 浏览

string - 将人名解析为其组成部分的简单方法?

许多联系人管理程序都会这样做——你输入一个名字(例如,“John W. Smith”),它会自动在内部将其分解为:

名字: John
中间名: W.
姓氏: Smith

同样,它会计算出诸如“Jane W. Smith 夫人”和“Dr. John Doe, Jr.”之类的东西。也正确(假设您允许在名称中使用“前缀”和“后缀”等字段)。

我认为这是人们想要做的相当普遍的事情......所以问题是......你会怎么做?有一个简单的算法吗?也许是一个正则表达式?

我正在寻求 .NET 解决方案,但我并不挑剔。

更新:我很感激没有涵盖所有边缘案例和文化的简单解决方案......但是为了争论起见,我们假设您需要分片的名称(填写表格 - 例如税收或其他政府表格 - 是您必须在固定字段中输入姓名的一种情况,无论您喜欢与否),但您不一定要强制用户将他们的姓名输入离散字段(更少打字=更容易新手用户)。

您希望程序“猜测”(尽其所能)第一个、中间、最后一个等。如果可以,请查看 Microsoft Outlook 如何为联系人执行此操作 - 它允许您输入姓名,但是如果您需要澄清,可以打开一个额外的小窗口。我会做同样的事情——给用户一个窗口,以防他们想以离散的部分输入名称——但允许在一个框中输入名称并进行涵盖常见名称的“最佳猜测”。