如何在数据库模式中设计此关系

时间:2010-05-14 16:05:15

标签: database performance database-design

我的数据库中有一个表Car,其中一列是purchaseDate。我希望能够使用多种策略标记每辆车(限制为10个策略)。每项政策都有生命的时间(ttl,持续时间,如“5年”,“10个月”等),也就是说,自汽车购买日期起可以应用多长时间。

我需要执行以下操作:

  • 插入Car时,将设置多个策略(至少设置一个)
  • 有时会更新Car以添加/删除政策
  • 必须在考虑日期/政策的情况下进行搜索,例如:“选择今天任何政策未涵盖的所有汽车”

我目前的设计是(pol0..pol9是政策):

CREATE TABLE Car (
 id int NOT NULL IDENTITY(1,1),
 purchaseDate datetime NOT NULL,
 //more stuff...
 pol0 smallint default NULL,
 pol1 smallint default NULL,
 pol2 smallint default NULL,
 pol3 smallint default NULL,
 pol4 smallint default NULL,
 pol5 smallint default NULL,
 pol6 smallint default NULL,
 pol7 smallint default NULL,
 pol8 smallint default NULL,
 pol9 smallint default NULL,
 PRIMARY KEY  (id)
)

CREATE TABLE Policy (
 id smallint NOT NULL,
 name varchar(50) collate Latin1_General_BIN NOT NULL,
 ttl varchar(100) collate Latin1_General_BIN NOT NULL,
 PRIMARY KEY (id)
 )

我面临的问题是执行上述查询的sql是一个噩梦。 由于我不知道每个政策可以在哪个列,所以我必须检查每个政策的所有列等等。所以我想知道是否值得改变它。我的问题是:

  1. 选择smallint作为Policy id而不是'int IDENTITY'以节省一些空间,因为将有数百万的Car记录。它只是在创建策略时增加了复杂性,因为我们必须处理id等。是否值得这样做?

  2. 我在想,也许有更好的设计?显然,我们可以将政策/汽车关系转移到自己的表CarPolicy,好处是:

    • 每辆车10条政策没有限制
    • 添加/删除等更容易
    • 当仅应用默认策略时(当没有应用其他策略时,应用了一个名为默认策略),我们可以通过在CarPolicy中没有任何条目来发出信号,现在这只是在其中一个中插入默认策略ID列。

    缺点是我们需要更改数据库,ORM类等。您会推荐什么?

  3. 也许有另一种智能方法可以实现这一点,我们不知道如何不使用CarPolicy表?

3 个答案:

答案 0 :(得分:4)

  1. 很长一段时间以来,值得使用smallint来节省空间;你不会看到这样做的表现有任何显着差异,它只会造成潜在的麻烦。

  2. 出于您列出的原因,单独的CarPolicy表肯定是执行此操作的正确方法。进行更改有一个前期时间成本,但一旦完成,它就会完成,并且在节省麻烦的情况下会多次付出代价。

答案 1 :(得分:0)

我建议给出它自己的关系表,包含车辆ID和政策ID。

答案 2 :(得分:0)

我建议您更改它,以便您拥有一个包含Car ID的Policy表。因此,您不必链接到Car表中的一堆策略,而是链接到Policies表中的一个Car。然后,您将包含TTL列和状态列,以便它们可以过期,您可以使用策略表中的Car Id进行查询。

只要每个政策只能有1个汽车,每个政策只有1个汽车(没有汽车的政策,对吧?)那么这是一个很好的方法。

更新:啊,我误读了。如果它是一个多对多,那就像其他人说的那样做并制作CarPolicy表。