代码之家  ›  专栏  ›  技术社区  ›  MunkiPhD

关于动态条目的数据库设计-一行还是多行?

  •  1
  • MunkiPhD  · 技术社区  · 16 年前

    我一直在尝试为一个副项目设计一个数据库模式,但是我没有能够生成任何我满意的东西。我正在使用带有Linq的ASP.NET进行数据访问:

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

    如果我把这个条目放在1行中,它很容易等于大约30+列(最小值),例如。 项目名称(参考) 项目权重1 单位体积 项目名称…等。。。

    我不能简单地将这些列转换成引用表,因为每个属性的范围从1到400+不等。

    我还认为,如果一个用户只决定将一个项目放入他们的条目中,那么我为该数据创建对象的方法将是静态的,就像使用Linq一样,我必须检查属性和其他内容是否为空,并相应地工作。另外,如果我想增加一个条目中允许的项目数量,那就让我头疼了。

    我想到的另一个选项是为每个项目创建一行,并用条目ID绑定它。所以我基本上不会有空条目,但我的表会增长到天文数字般的深,但不会非常宽,因为只有大约5个奇数列。

    在我的设计中有什么我忽略了的吗/有没有更好和有效的方法?

    编辑:当我说它将以天文数字的形式增长时,我的意思是:用户可以创建一个条目,并且每个条目最有可能有一组条目。所以假设他们每天进入一个网站,他们可以有三组项目,最大项目数(10),这相当于30个项目的唯一进入。以这样的速度在一周内每天进行一次输入,您可以为该单个用户创建210行。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Bill Karwin    16 年前

    我建议采用您提到的后一种设计,创建一个包含五列的从属表:

    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 但省略 项目编号 它会自动获取下一个未使用的值(但如果删除一个值,则不会填充间隙)。您不需要说明您使用的是哪个品牌的数据库,所以我将把它留给您来了解这个特性。

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

        2
  •  0
  •   Manu JCasso    16 年前

    使用单个项目表:

    userid、itemindex、isreference、numericvalue、referencevalue

    这样,用户999的项目名称的值转换为

    999,3,真,空,值

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

        3
  •  0
  •   Tony Andrews    16 年前

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