【问题标题】:Avoid using dynamic table names, but how?避免使用动态表名,但是如何使用呢?
【发布时间】:2013-07-26 00:15:01
【问题描述】:

我是数据库设计的新手,我正在尝试尽早进入最佳实践。到目前为止,我所看到的所有地方似乎都同意您“在开发开始时创建表名,并插入您的数据,使用变量作为表名。好吧,我正在寻找一个资产管理系统,我无法克服看似设计缺陷的问题。如果您熟悉,该软件将与“quickbase”非常相似。

这里是场景。

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

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

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

如果这过于本地化或含糊不清,请告诉我,我将提供所需的任何进一步详细信息。

感谢您的宝贵时间

编辑

回应 Davids 的精彩回答。

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

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

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

【问题讨论】:

  • "each account is its own table" - 你把我弄丢了。为什么每个帐户都需要自己的表?不应该有一个 Accounts 表,然后是与 Accounts 相关的数据表,这些表具有返回该表的外键?
  • @David 你说得对,我肯定错了,我会有一张包含帐户信息的表格,然后里面的数据会链接回其他相关表格。我编辑了我的问题以更好地反映我的目标

标签: database database-design logic


【解决方案1】:

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

鉴于此,此说法不正确:

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

Account(或Accounts,取决于您的命名约定)表是描述帐户实体的示意性定义。它可能有诸如帐户名称、注册日期之类的列。 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 表中添加一条记录。

【讨论】:

  • 非常感谢先生。我很感激我的努力,这有助于我更好地想象我的问题,请查看我的问题的编辑,因为它是我问题的核心。
  • @i_me_mine:我认为您可能忽略了外键对表的作用的概念。您不需要账户 A 和账户 B 拥有自己的财务表。您将有一个Financials 表,其中一列是Accounts 表的外键。所以Financials 表中的每条记录都会有一个字段指示它与哪个Account 相关。所以在我回答的Task 表中,每条记录都有一个AccountID 值,它指向它所属的Account 记录。因此,所有 Accounts 都将使用相同的 Tasks 表(或 Financials 表等)。
  • 这实际上很有意义。所以它是一张桌子来统治他们,嗯?我喜欢。因此,只需使用适当的关系创建我需要的许多表,然后在我开发的剩余时间里,我永远不必动态创建表。感谢您将一个无知的人变成了一个受过更多教育的人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2010-10-24
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
相关资源
最近更新 更多