2010-05-14 188 views
0

我在我的数据库中有一个表Car,其中一列是purchaseDate。我希望能够通过一系列政策来标记每辆车(限制为10项政策)。每项政策都有一定的时间(ttl,持续时间,如“5年”,“10个月”等),也就是说,自汽车购买日期起,该政策可以适用多久。如何在数据库模式中设计这种关系

我需要执行以下操作:

  • 插入汽车的时候,它会与一些政策(至少一个设置)
  • 有时车将更新,增加了集/删除策略
  • 搜索必须做到兼顾日期/政策,例如:“选择并不受任何政策从今天开始所有的车”

我现在的设计是(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作为策略ID被选择,而不是一个“诠释身份”为了节省,因为将是数以百万计的汽车记录一些空间。它只是增加了创建策略时的复杂性,因为我们必须处理id等。值得这样做吗?

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

    • 每车10个政策
    • 添加/删除等更容易没有限制
    • 当只有默认策略应用(当没有人应用其中一个叫做默认策略时),我们可以通过在CarPolicy中没有任何条目来表示信号,现在只需在其中一列中插入默认策略ID。

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

  3. 也许有另一种聪明的方式来实现这一点,我们不知道没有使用CarPolicy表?

回答

4
  1. 这是一个漫长的时间,因为它是值得使用SMALLINT节省空间;在这样做的过程中,你不会看到任何显着的性能差异,这只会造成潜在的麻烦。

  2. 出于您列出的原因,单独的CarPolicy表格绝对是正确的方法。做出改变需要付出一定的时间,但一旦完成,它就会完成,而且它会为保存的麻烦多次付出代价。

+0

+1我的话刚好输入得更快:) – 2010-05-14 16:13:36

+0

和我的。任何时候你开始有这样的列,它会让你疯狂。无论如何这并不是那么高效。 – 2010-05-14 16:27:29

+0

好的,选择这个,这是我从一开始就想到的,但不知道我是否能够实际实现它。必须考虑如何升级与数百万行的现有安装... – Persimmonium 2010-05-14 21:50:13

0

我会建议给它的关系它是自己的表,包含一个车号和一个政策ID。

0

我会建议改变它,以便你有一个政策表,其中有汽车Id。因此,不是链接到Car表格中的一组策略,而是链接到Policies表格中的单个Car。然后,您将包含一个TTL列和一个状态列,以便它们可以过期,并且您可以使用政策表中的车辆识别号进行查询。

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

更新:啊,我误读了。如果是多对多的话,就像其他人所说的那样做CarPolicy表。

+0

我敢肯定,Policy.id是一个政策*类型* - 有<256可能的ID - 所以这看起来像一个多对-many(Cars-to-Policies)案例。 – egrunin 2010-05-14 20:47:30

+0

是的,这就像egrunin解释... – Persimmonium 2010-05-14 21:49:03