我一直在尝试为一个副项目设计一个数据库模式,但我一直无法生成我满意的任何东西。我将 ASP.Net 与 LINQ 一起用于我的数据访问:
我将允许用户指定最多 10 个“项目”,每个项目具有 2 个数字属性和 1 个引用属性,即项目名称。
如果我将此条目放入 1 行,它很容易等于大约 30 多列(最少),例如 item_1_name(引用) item_1_weight item_1_volume item_2_name...等...
而且我不能简单地将这些列转换为引用表,因为每个属性的范围基本上可以从 1 到 400+。
我还认为,如果用户只决定将 1 个项目放入他们的条目中,我为该数据创建对象的方法将是静态的,就像 LINQ 一样,我必须检查属性和诸如此类的东西是否为 NULL并相应地工作。此外,如果我想增加条目中允许的项目数量,使用起来会很头疼。
我想到的另一个选择是简单地为每个项目创建一行并将其与条目 ID 绑定(bind)。所以我基本上不会有空条目,但我的表会增长到天文数字的深度但不会很宽,因为只有大约 5 个奇数列。
我在设计中是否忽略了什么/是否有更好、更有效的方法来做到这一点?
编辑:当我说它会以天文数字增长时,我的意思是这样的:用户可以创建一个条目,每个条目很可能有一组项目。假设他们每天进入该网站 1 次,他们可以有 3 组项目,项目的最大数量 (10),这相当于单个条目的 30 项。以该速度每天输入一个条目,持续一周,您可能会为该单个用户创建 210 行。
最佳答案
我推荐你提到的后一种设计,创建一个包含五列的从属表:
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
它会自动获取下一个未使用的值(但如果删除一个值则不会填补空白)。你没有说明你使用的是哪个品牌的数据库,所以我会留给你来弄清楚这个功能。
编辑:正如 Tony Andrews 在他的回答中所说,行数不是问题。您没有说明您打算使用哪个品牌的数据库,但除非您选择像 MS Access 这样特别弱的产品,否则您可以依靠数据库轻松处理数百万行。如果您选择好索引,并编写使用这些索引的查询,效率应该不是问题。
关于关于动态条目的数据库设计 - 一行还是多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/262361/