1

我一直在尝试为一个副项目设计一个数据库模式,但我无法生成任何我喜欢的东西。我正在使用带有 LINQ 的 ASP.Net 进行数据访问:

我将允许用户指定最多 10 个“项目”,每个项目具有 2 个数字属性和 1 个引用属性,即项目名称。

如果我将此条目放入 1 行,它很容易等于大约 30+ 列(最少),例如 item_1_name (ref) item_1_weight item_1_volume item_2_name...等...

而且我不能简单地将这些列变成参考表,因为每个属性的范围基本上可以从 1 到 400+。

我还认为,如果用户只决定将 1 项放入他们的条目中,那么我为该数据创建对象的方法将是静态的,就像 LINQ 一样,我必须检查属性和诸如此类的东西是否为 NULL 并相应地工作. 此外,如果我想增加条目中允许的项目数量,使用起来会很头疼。

我想到的另一个选择是简单地为每个项目创建一行并将其与条目 ID 绑定。所以我基本上永远不会有空条目,但我的表会变得非常深,但不会很宽,因为只有大约 5 个奇数列。

我的设计中是否有一些我忽略的东西/是否有更好和有效的方法来做到这一点?

编辑:当我说它将以天文数字增长时,我的意思是:用户可以创建一个条目,每个条目很可能有一组项目。因此,假设他们每天访问该站点 1 个条目,他们可以拥有 3 组项目,最大项目数 (10),这相当于该唯一条目的 30 个项目。以该速率每周输入一个条目,您可以为该单个用户提供 210 行。

4

3 回答 3

2

我推荐你提到的后一种设计,创建一个包含五列的依赖表:

CREATE TABLE Items (
  user_id               INTEGER NOT NULL,
  item_id               INTEGER NOT NULL DEFAULT 1,
  numeric_property1     INTEGER,
  numeric_property2     INTEGER,
  referential_property  INTEGER,
  PRIMARY KEY (user_id, item_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id)
                        ON DELETE CASCADE,
  FOREIGN KEY (item_id) REFERENCES num_items(item_id),
  FOREIGN KEY (referential_property) REFERENCES some_other_table(some_column)
);

我在上面显示了一个表格num_items,如果您想将用户最多限制为 10 个项目,则其中包含数字 1 到 10:

CREATE TABLE num_items (item_id INTEGER NOT NULL );
INSERT INTO num_items (item_id) 
  VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

这种设计的优点是很COUNT()容易计算给定用户有多少项目,很容易计算诸如给定属性之类的东西MIN()MAX()您可以为引用属性强制执行外键等。

某些数据库具有将复合主键的第二部分(item_id在这种情况下)声明为自动递增的功能,因此如果您指定值entity_id但省略item_id它会自动获取下一个未使用的值(但如果您删除则不会填补空白一)。您没有说明您使用的是哪个品牌的数据库,所以我会留给您来确定此功能。

编辑:正如托尼安德鲁斯在他的回答中所说,行数不是问题。您没有说明您打算使用哪个品牌的数据库,但除非您选择像 MS Access 这样特别弱的产品,否则您可以依靠数据库轻松处理数百万行。如果您选择好索引,并编写使用这些索引的查询,那么效率应该不是问题。

于 2008-11-04T16:43:12.290 回答
0

使用单个项目表:

userId、itemIndex、isReference、numericValue、referenceValue

这样,用户 999 的 item_3_name 的值转换为

999,3,true,null,值

您必须自己强制执行某些约束,例如每个用户的最大项目数等。

于 2008-11-04T16:38:45.993 回答
0

正确的数据库设计是将每个用户/项目存储在单独的行中。这将更容易使用,并消除了 10 项的任意限制。我不会说它会增长“天文数字”,大约会有 10 x(用户数量)行。

于 2008-11-04T16:43:19.417 回答