数据库架构设计查询

时间:2012-01-13 11:19:50

标签: mysql database-design

我正在设计一个数据库,用于交换汽车的网站。

Autos具有不同的属性和属性类型,如

“多媒体”,“安全”等类型的属性 用于检查ABS,Airbages,ESP等

我想以1和0组合的形式将所有这些属性保存在一个cloumn中

1001000101

但我的问题是,如果我更改数据库中属性名称的位置如何更新此组合“1001000101”?或者应该是最好的方法。

4 个答案:

答案 0 :(得分:0)

您希望将所有标志放入单个列中会有什么好处,这会超过将它们作为单独的布尔属性的可维护性?

如果你的标志组相当稳定,我建议你至少启动,将它们建模为单独的布尔列,这将更容易管理。如果它能提供一些其他可衡量的好处,那么以后管理它们会更加复杂。

答案 1 :(得分:0)

尝试使用bit data type(请参阅storage requirements - 似乎更合乎逻辑,更简单的解决方案

答案 2 :(得分:0)

如果您希望以这种方式执行此操作并将属性保存在一个数据字段中,则将关系“attribute”更改为该位置必须导致数据的管理更新。由于数据库不知道这种关系,因此没有简单的方法来自动执行此更新。

每次发生此类事件时,您都必须执行此类操作。

基于这种表格的理论:

CREATE TABLE `yourtable` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `yourfield` varchar(16) DEFAULT NULL,
  `backupfield` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 
  1. 将旧值存储在单独的字段中。
  2. 这可能如下所示:

    UPDATE yourtable SET backupfield = yourfield;
    
    1. 更新字段。
    2. 如果您将位置3与7交换,它可能如下所示:

      UPDATE yourtable
      SET yourfield = CONCAT(
          LEFT(backupfield,2),    // everything left of first position
          MID(backupfield,7,1),   // old position 7
          MID(backupfield,4,3),   // everything between first and 2nd position 
          MID(backupfield,3,1),   // old position 3
          MID(backupfield,8));    // everything right of 2nd position
      

      你有什么理由想这样做吗?如果没有具体原因,可以使用单独的字段(更简单)。

答案 3 :(得分:0)

除非您不必处理严重的性能问题,否则不应对数据库进行反规范化。

几年前我在一个主要的二手车市场工作,我们添加了一个文本列,其中包含汽车设备项,1,3,7,55,的分隔ID值,并在搜索中使用了'equiment LIKE'%,55,%'查询。

然而,我们始终保持标准化数据模型与汽车和设备之间的关系

car_id    equip_id
1         3
1         55

保持equipment列和car_equipment关系同步可以由DAL或数据库触发器处理。

请记住,除了为您的前端市场提供服务外,您可能还必须为其他目的提供报告 - 如果您的所有设备/属性数据都编码在一列中,如果没有逻辑构建您的DAL就无法查询,那么您就是捣毁。