2008-11-04 9 views
1

我一直在试图设计一个侧面项目的数据库模式,但我还没有能够生产任何我感到满意的东西。我正在使用ASP.Net和LINQ进行数据访问:关于动态条目的数据库设计 - 一行还是多行?

我将允许用户指定多达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行。

回答

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,包含数字1到10,如果你想在最限制用户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这样特别微弱的产品,否则你可以依靠数据库轻松处理数百万行。如果您选择好索引,并编写使用这些索引的查询,效率应该不成问题。

+0

对于item_id而不是外键使用CHECK约束会更好吗? – Dave 2008-11-04 16:51:21

0

使用单个项目表:

用户id,的ItemIndex,isReference,numericValue,referenceValue

这种方式对于用户999 item_3_name值转换为

999,3,真实,空,值

您必须自己执行某些约束,sa最大数目每个用户的项目等

+0

您正在描述EAV设计,这在可伸缩性和参照完整性方面存在很多问题。例如,你如何在引用属性上声明一个外键? – 2008-11-04 16:44:31

0

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