2013-06-28 144 views
3

我有用于存储公司资产多个表,这些表包括: -创建多个锁定表比。创建一个查找表

•汽车

•服务器

•电脑

•家具

现在对于每个资产,我想创建一个商店资产模型查找表,例如在创建新PC时,用户将选择型号“Dell vostro 350”等。 但是有什么更好的;要定义四个查找表(如vechicle_model,Server_models,Pc_models,furniture_model),或定义一个查找表,并有一列描述它的类型(Type = PC)

问候

+0

http://martinfowler.com/eaaCatalog/classTableInheritance.html –

回答

1

如果你只是打算用于查找,我会选择一个表格解决方案。

如果您打算根据其型号存储有关资产的其他信息,例如车辆是汽油/柴油车,还是PC机是台式机或笔记本电脑,那么多表解决方案可能会更好。

+0

但是一张表会影响性能,因为我必须过滤只有特定类型的资产。例如,当我在新车上做广告时,我不得不搜索那些型号为Vechicle的车型。你觉得怎么样? –

+0

它可能会产生影响,但是,我猜这个表格不会是数千行而不是数百万行,并且asset_type或assert_type,model_name上的索引会有所帮助 –

5

使用单独的查找表,尽管它们可能具有相似性 - 除非您a)想要允许某人存储Dell vostro 350作为家具类型,或者b)想要在数据库中具有显着更复杂的约束条件防止这种交叉选择被记录。实际上,您对单个查询表的建议是众所周知的,它甚至获得了它自己的缩写--OTLT,一个真正的查找表的缩写。如果你关心搜索它,它几乎总是被称为“反模式”或“初学者错误”。

1

这些表是否共享相同的列,约束和物理存储?

  • 如果是,他们应该是一张表。
  • 如果不是,请将它们分开。

请注意,上述条件实际上比第一眼看起来更难实现。例如,如果出现以下情况,应将表格分开保存:

  • 对于每个表,任何键都应该是唯一的,而不是所有表中的行的联合。
  • 外键存在于一个表中但不是另一个,或外键引用一个表,但不是另一个表。
  • CHECK约束存在于一个表中,但不存在于另一个表中。这甚至包括简单的东西,例如NOT NULL。
  • 列类型或宽度是不同的。
  • 触发器是不同的。
  • 权限是不同的。
  • 需要采取表级锁。
  • 表需要以不同的方式进行群集或分区,或者存储在不同的磁盘上,或者在其他一些物理存储参数(取决于DBMS)上有所不同。
  • 等...

所以,很可能你会需要继续保持的表分开。