我在我的数据库中有一个表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是一个噩梦写。 因为我不知道每个政策的哪一栏可以是,所以我必须检查每个政策的所有列等等。所以我想知道这是值得改变的。我的问题是:
的SMALLINT作为策略ID被选择,而不是一个“诠释身份”为了节省,因为将是数以百万计的汽车记录一些空间。它只是增加了创建策略时的复杂性,因为我们必须处理id等。值得这样做吗?
我在想,也许有更好的设计?显然,我们可以移动的策略/车关系到它自己的表CarPolicy,好处是:
- 每车10个政策
- 添加/删除等更容易没有限制
- 当只有默认策略应用(当没有人应用其中一个叫做默认策略时),我们可以通过在CarPolicy中没有任何条目来表示信号,现在只需在其中一列中插入默认策略ID。
缺点是我们需要更改数据库,ORM类等。您会推荐什么?
也许有另一种聪明的方式来实现这一点,我们不知道没有使用CarPolicy表?
+1我的话刚好输入得更快:) – 2010-05-14 16:13:36
和我的。任何时候你开始有这样的列,它会让你疯狂。无论如何这并不是那么高效。 – 2010-05-14 16:27:29
好的,选择这个,这是我从一开始就想到的,但不知道我是否能够实际实现它。必须考虑如何升级与数百万行的现有安装... – Persimmonium 2010-05-14 21:50:13