相关疑难解决方法(0)

在订单表中存储账单地址最佳实践

有人能帮我理解这个用户对CustomerLocation表的回答吗?我真的想要一个在订单表中存储地址的好方法。

我正在寻找的是如何设置我的地址,以便在我编辑它们时,订单不受客户更新地址或搬迁这一事实的影响。

就目前而言,我的架构看起来类似于:

 Person           |EntityID|
 EntityAddress    |EntityID|AddressID|
 Address          |AddressID|AddressType|AddressLine1|AddressLine2|
 Order            |OrderID|BillingAddressID|
Run Code Online (Sandbox Code Playgroud)

database-design best-practices

13
推荐指数
1
解决办法
3万
查看次数

如何在mysql中启用时态数据库功能。?

如何在mysql数据库中启用时态数据库兼容性

是否有任何library或一个plug-in启用时间向上兼容性?我想在当前记录发生变化时保留过去的记录。

mysql database-design mysql-5.5

7
推荐指数
3
解决办法
8840
查看次数

将个人数据存储在发票上以保持数据完整性

我想存储发票数据,如人员地址。但问题是地址会随着时间的推移而改变——例如,有人会搬出去改变他的地址。存储此类数据的问题出现了,因为我们无法更改某些发票上引用的数据。

我有 3 个表:(AddressInfo包含 StreetAddress 等),Person它们与AddressInfo, 和Invoice表具有一对多关系。

我有两个解决方案,但我不确定哪个方向是正确的方法:

  • 创建AddressInfo并使其可软删除,添加一些类似的列IsActiveIsDeleted以便我的Invoice表可以通过其 ID 引用此地址信息,并且保证保持不变,除非有人在不使用我的应用程序的情况下直接更改此数据。

    因此,当有人更改他的地址时,我会软删除(也许应该称为软更新?)当前地址并添加新地址,而根本不会触及旧记录。最好先检查一下发票上是否引用了它以防止污染。

    我的Invoice桌子看起来有点像:

    | InvoiceId | AddressInfoId |

  • 将所需的列添加AddressInfo到我的Invoice表中。每次创建新发票时,我都必须复制数据,地址不会经常更改,重复记录会稍微污染我的数据库。

    我的Invoice表看起来有点像(大大简化):

    | InvoiceId | StreetAddress |

您是否有使用解决此特定问题的数据库(可能是某些 ERP 软件)的经验?


有趣的朗读:

https://martinfowler.com/eaaDev/timeNarrative.html

schema database-design denormalization

7
推荐指数
1
解决办法
2159
查看次数

存储完整/部分表的历史记录

我正在使用 Django 和 MySQL (InnoDB) 构建一个 Web 应用程序,目前正在考虑如何管理各种表上的历史更改。

我想知道在那些没有改变的行上存储大量带有 NULLS 的行是否有效。例如,这是我的产品表的简单表示;

在此处输入图片说明

products_history表的所​​有字段(FK和非逻辑行除外)都设置为NULL,而普通products表的NOT NULL所有字段都设置为,除了description

现在我想到的是推送实际产品行的副本并将更改推送到products_history表中。所以假设我有这一行products

{600, CURRENT_TIMESTAMP, 2, 'BS001', NULL, 49.95}
Run Code Online (Sandbox Code Playgroud)

并将价格更改为48.50。所以我会推送哪些值发生了变化,在这种情况下base_price,将更改行添加到历史表中;

{600, THE_date_created_FROM_PRODUCT, NULL, NULL, 49.95}
{600, CURRENT_TIMESTAMP, NULL, NULL, 48.50}
Run Code Online (Sandbox Code Playgroud)

因此,在第一次修改产品时,它将获得 2 行,之后每次修改只有一个新的修改字段)。之后它将product使用新的base_price.

这种方法对我有用并且非常有效(因为只有第一次实际编辑产品时,历史表才会填充产品数据),但我想知道通过存储所有这些 NULL 值是否有效。一段时间后它会影响我的表现还是影响不会那么大?

除此以外; 我很好奇在 MySQL 中这样做的好方法,甚至是 Django ORM 特定的方法。

mysql innodb

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

为具有多个用户名的单个用户建模的最佳方法

我想写一个网站,用户将使用他们的电子邮件地址和密码登录,但可以有多个用户名。

上下文是一个社交游戏网站。这可能会导致用户希望拥有多个用户名。例如,一个用于在团队中玩游戏的用户名(前缀或类似的)和一个用于单独玩游戏的用户名。

我一直在努力寻找在我的数据库中表示它的最佳方式,到目前为止我想出了:

尝试一

在此设计中,每个用户的用户名中只有一行将 active 设置为 true。这对我来说有点味道。如果给定用户的行没有将 active 设置为 true 怎么办?

尝试二

我想对于这个,我们或多或少地保证每个用户都有一个用户名,并且拥有的用户名表提供了用户拥有的用户名列表。感觉好多了,但是有重复的信息(活动时在两个表中指定了用户名)。

任何人都对我如何构建它有更好的想法?这有共同的模式吗?

从本质上讲,我所设想的是一种为我的网站提供功能的方式,即每人拥有一个用户,使用电子邮件和密码登录,并将一个或多个用户名链接到该用户。

我猜用户和用户名之间存在 1:N 关系,其中 N > 0。我只是不确定如何有效地对此进行建模。或者实际上,如果这表明我想要的功能需要重新思考。

没有正式的团队概念,这只是一个例子,一个人可能想要多个用户名。

当然,我们可以简化这一点并强制需要单独用户名的人多次注册。这将大大简化数据库,但允许多个用户名一次登录对用户来说更方便。

我正在考虑将其限制为最多 2 或 3 个,但我想这不会改变设计,只是前端限制。

database-design

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

对数据库中的数据进行版本控制

我有一个数据库来保存有关projects.

项目有大量与它们相关的数据,这些数据被分割到其他表中,例如project_contactsproject_images。这些是一对多关系,其中 1 个项目可以有多个联系人和多个图像。

但是,我需要能够保留项目的“版本”。因此,如果更新了项目,则有关该项目的先前数据仍然存在。这是多对多关系的一个大问题。例如,有一个categories表,一个project_categories表——很多项目可以有很多类别。

当一个项目更新时,并不是每条数据都会更新。例如,如果一个项目有一个新联系人,它不会总是有一个新图像,因此图像表不会更新。

我考虑过的一种解决方案是拥有一个versions带有自动递增 ID的表;一project_id列和一time列。每个表也将获得一version_id列。每当更新项目时,都会在versions. 然后,当表被更新时,version_id也会被输入。这意味着有关项目的最新行project_images可能是 3,而最新版本project_contacts可能是 27。

由于version_id是递增的,因此获取单个项目的最新版本非常简单,因为您可以按最高version_id.

这个想法对我来说似乎失败的地方是,如果我想从特定日期获取项目的版本。

我可以使用我当前的解决方案来解决这个问题吗?

postgresql database-design

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

SQL - 具有相同表和关系约束的多对多关系

我有一个 SellerProduct 表。表格中的每一行代表卖家提供的产品信息。SellerProduct 表包含以下列:

id (serial, pk)
productName (nvarchar(50))
productDescription (ntext)
productPrice (decimal(10,2))
sellerId (int, fk to Seller table)
Run Code Online (Sandbox Code Playgroud)

不同卖家的产品可能相同,但每个卖家的 productName、productDescription 和 productPrice 可能不同。

例如,考虑产品 TI-89。卖家 A 可能拥有产品的以下信息:

productName = TI-89 Graphing Calc
productDescription = A graphing calculator that...
productPrice 65.12
Run Code Online (Sandbox Code Playgroud)

卖家 B 可能拥有以下产品信息:

productName = Texas Instrument's 89 Calculator
productDescription = Feature graphing capabilities...
productPrice 66.50
Run Code Online (Sandbox Code Playgroud)

管理员用户需要确定不同卖家的产品是相同的。

我需要一种方法来捕获这些信息(即卖家的产品是相同的)。我可以创建另一个名为 SellerProductMapper 的表,如下所示:

sellerProductId1 (int, pk, fk to SellerProdcut table)
sellerProductId2 (int, pk, fk to SellerProdcut table)
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于它允许对给定行的 SellerProductId1 和 SellerProductId2 来自同一个卖家。这不应该被允许。 …

database-design table many-to-many

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

将两个整数存储为小数

将两个整数存储为小数有什么缺点?

我将资产详细信息存储在表中,每种资产类型都有自己的表(每种资产都非常不同)并使用另一个表来定义资产表,因此每个资产表都有一个整数 id,每个资产也有一个整数 id。

我有两种不同的场景,这可能很方便:

  1. 有一个“审计”表,其中存储如下信息:这个用户对那个项目做了这个

  2. 有人被指派处理这种类型的资产。我正在考虑将它存储为 assetType.assetID,因此资产类型 5 和 id 99 将是十进制 5.99

我很少需要根据 5.99 进行选择,我只会查询存储 5.99 的记录,然后将其拆分并使用函数转到表 5 的记录 99。

我无法将资产 ID 绑定到特定表;assetType 是表中引用资产表的条目的 id(定义表名、主键列等内容),因此似乎我无法以任何方式使用外键约束。

有很多资产表,例如asset_tmvasset_backflow。资产根据它所在的表分配类型,因为要为每个资产存储的数据差异很大。

我意识到我可以使用 2 个整数字段来实现这一点。我想知道的是:缺点是什么?

mysql database-design decimal

5
推荐指数
2
解决办法
600
查看次数

具有有效性间隔的可移植表设计(历史化、时态数据库)

我正在为一个应用程序设计一个数据模型,它必须跟踪数据的变化。

第一步,我的应用程序必须支持PostgreSQL,但我想在第二步中添加对其他 RDBMS(尤其是 Oracle 和 MS SQL 服务器)的支持。因此,我想选择使用较少专有功能的便携式数据模型。(表的 DDL 可能因 RDBMS 供应商而异。但应用程序中的 SQL 查询/语句对于所有支持的供应商应尽可能相同。)

例如,假设有users一张users_versions桌子。users_versions在 上有一个外键users

表的示例可能如下所示:

users
----------------
id | username
---------------- 
 1 | johndoe
 2 | sally

users_versions --> references id of user (userid)
---------------------------------------------------------------------------
id | userid | name     | street      | place     | validfrom  | validuntil
---------------------------------------------------------------------------
 1 |      1 | John Doe | 2nd Fake St | Faketown  | 2018-01-04 | 2018-01-05
 2 |      1 …
Run Code Online (Sandbox Code Playgroud)

postgresql index oracle database-design sql-server

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

为大量不同的实体存储创建/退休日期

在我现在正在处理的数据库中,几乎每个实体都有这 4 列:

CreatedDate
CreatedBy
RetiredDate
RetiredBy
Run Code Online (Sandbox Code Playgroud)

通常这用于记录目的,对于某些实体来说,知道它何时退役的有用性是有争议的(但不要告诉我的老板)。对于其他一些东西,(比如卡车)它更有意义,因为“退役”的车辆可能会重新投入使用。

无论如何,我想知道将这些信息放在一张桌子上是否是个好主意,因为它到处重复。如果是的话,任何人都有一个好名字..?简单created_retired_dates吗?

schema normalization database-design

4
推荐指数
1
解决办法
1801
查看次数

如何在 PostgreSQL 中构建仅附加数据库?

前言

多年来,我们一直在使用具有糟糕且低效的数据库结构的单体程序。现在我们终于用我们自己的程序摆脱了它。

我们唯一遇到困难的领域是数据库。我们的数据是财务数据,我们现有的程序主要通过覆盖 ( UPDATE, DELETE)导致数据丢失。我们决定采用仅追加的结构来保存我们积累的所有数据。如果仓库增长超过我们最初的估计,我们可能会考虑使用它,但与此同时,我们预计数据库会在几年内增长到一些较大表的数百万行;在这一点上规模不大。

我们使用PostgreSQL,将被拒绝修改特权,比如UPDATEDELETE用户,以确保数据的一致性历史。


我们的理念

我们认为我们可以将所有当前和历史数据包含在一个表中,以便我们查询timestamp每个记录的最后一条(或最新),id如下表所示。

澄清一下,我们有几十个表;下面代表一个这样的表的简单版本。

????????????????????????????????????????????????????
? key ? id ? field1 ? field2 ? timestamp           ?
????????????????????????????????????????????????????
? 0   ? 0  ? a      ? b      ? 1970-01-01 00:00:01 ?
????????????????????????????????????????????????????
? 1   ? 1  ? x      ? y      ? 1970-01-01 00:00:02 ?
????????????????????????????????????????????????????
? 2   ? 0  ? a      ? c      ? 1970-01-01 00:05:01 ? # new version of id=0 row
????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我们还考虑了 NoSQL …

postgresql database-design

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