0

我是数据库设计的新手,我正试图尽早进入最佳实践。到目前为止,我所看到的所有地方似乎都同意您“在开发开始时创建表名,并插入您的数据,不要使用变量作为表名。好吧,我正在寻找一个资产管理系统,我可以不要越过看似设计缺陷的地方。如果你熟悉的话,这个软件会非常类似于“quickbase”。

这是场景。

  • 用户可以创建帐户,每个帐户都在一个帐户表中,其中包含链接回其他相关表的数据。
  • 在每个帐户中,都有尽可能多的类别来跟踪信息,例如:
    • 金融
    • 旅行
    • 任务
    • ETC

现在,这些类别中的每一个都将包含大量信息,并且需要它自己的表。显然我可以使用关系将这些表连接回帐户,但它们是一个问题(我认为)。用户可以根据需要创建任意数量的帐户,并且每次他们都需要创建许多其他表。如“account_name_financials_table”等。

所以我的问题是:在动态创建表名时,是否可以不使用变量作为表名。或者,在这种情况下,在创建表名时使用变量作为表名是可以接受的。

如果这过于本地化或模糊,请告诉我,我将提供所需的任何进一步细节。

感谢您的时间

编辑

为了回应戴维斯的精彩回答。

我现在完全理解每个帐户实际上只是一个条目,或者一个表中的一行,该表将保存每个帐户的信息。然后,列名将描述描述我的帐户并随后与其他表相关的数据。

现在这个问题的核心是,当我创建帐户时,还有其他表需要创建,或者至少我认为它们会创建。例如,这将是一个财务表,其中包含有关该帐户财务的特定信息。这些表上存在一对一的关系。意思是账户 A 只能有一组特定账户的财务。因此,当我创建帐户 B 时,我当前拥有的财务表将不再具有帐户 B 的相关列名、行或数据。因此,当我为帐户 B 创建这些新表时,它们很可能需要动态完成。话虽如此,我如何在没有变量名的情况下创建它们?

或者也许我仍然没有抓住重点。我突然想到,也许我可以拥有一个包含所有帐户信息的大型财务表,并且该信息通过“id”或其他一些唯一的 fk pk 标识符定义/关联回特定帐户?

4

1 回答 1

1

不要将表视为您域中的实体,将其视为描述实体的定义,并且该表中的每条记录都是该实体的实例。

鉴于此,此陈述变得不正确:

用户可以创建账户,每个账户都是自己的表。

AccountAccounts,取决于您的命名约定)表是描述帐户实体的示意图定义。它可能有诸如帐户名称、注册日期之类的列。表中的每条记录Account都是一个帐户。所以会有一张Account表来保存域中的所有帐户。

在每个帐户中,他们可以跟踪 4 - 8 个类别

用这种说法来描述关系数据似乎有点违反直觉。怎么样:

每个帐户还可以具有与其相关的其他数据,例如...

现在下一行不是在描述帐户“内部”的东西,而是域中恰好帐户相关的另一个实体:

  • 金融
  • 旅行
  • 任务
  • 等等

这些中的每一个本身就是一个实体(或者无论如何可以是,目前的术语有点模糊),它们不一定描述一个帐户,但它们本身是一个帐户描述的。也就是说,帐户不指向任务。一个任务指向一个帐户。帐户本身是描述任务的数据点。

因此,这些中的每一个都成为了自己的表,其中记录具有返回Account表的外键。像这样简单的事情:

Task
----------------------
ID          | int
AccountID   | int
Description | nvarchar
ScheduledOn | datetime

等等。该表中的每条记录(每条记录代表域中的一个任务)将包含一个AccountID值,该值指示哪个帐户拥有该任务。

这些表应该特定于任何特定的实体子集,但应该通用于该特定实体的所有实例。

您可以通过子类型表进一步将实体自定义为不同的类型。例如,也许您有不同类型的帐户,并且有不同的字段来描述它们。您可能有一个Account如上所述的表,但会有其他表,其中主键也是Account表的外键。这些表将表示与表的一对一关系,Account并且可以向帐户的“子集”添加更多值。像这样的表,例如:

PreferredAccount
---------------------
AccountID       | int (PK, also FK to Account.ID)
PreferredStatus
BecamePreferredOn

等等。这样,您可以按类型在逻辑上分隔您的帐户,而无需创建多个表来表示帐户本身。

回到问题上来……最终,当用户创建帐户时,他们不会更改数据库的架构。他们只是在Account表中添加一条记录。

于 2013-07-26T00:38:28.167 回答