【问题标题】:database schema : how to make dynamic table according to type?数据库模式:如何根据类型制作动态表?
【发布时间】:2014-02-27 09:09:07
【问题描述】:

我是新手。我正在设计数据库的架构,我被困在这个地方。 我有房间表,其中一个是 rooms_Items,这样每个房间都有很多 room_Items。
问题是我需要根据房间类型在 room_items 中使用不同的字段

房间

Id  name

1   LG-12FG

2   LG-31FG

Room_item

Id  name    room_id     required field

1   Window    1          mirror/type/size

2   Door      1           type/size/code

3   Wall      1           layer/color

4   Wall      2           layer/color

我不知道该怎么做。我需要为每个 room_item 类型制作新表吗?如果我这样做,我必须稍后进行条件连接以获取房间的所有项目。请帮忙

【问题讨论】:

  • 只是出于好奇,您会在数据库之上运行应用程序吗?有业务逻辑的应用?
  • @olovholm 是的,我必须先制作数据库,然后从一些外部来源导入数据
  • 为什么不转置你的设计?我知道管理起来会很复杂。但是会更好地规范化,您可以使用 PIVOT(SQL Server) 转回以加入其他表。同时它还将支持可扩展性。
  • @ShantanuGupta 请指导如何做到这一点?我想规范化数据

标签: mysql sql database oracle database-schema


【解决方案1】:

首选(标准化)解决方案是为每种项目类型(桌窗、桌门、桌墙)创建一个单独的表格。这将使选择数据变得更加困难,因为您必须进行多次连接。

或者,您可以创建包含项目所有属性的单个表:

item_id, room_id, type   , size, color,  code, type2      , layer
1      ,       1, Window ,  100,  NULL,  NULL, WindowType1, NULL
2      ,       1, Door   ,   90,  NULL,     1, DoorType1  , NULL
3      ,       1, Wall   , NULL,   red,  NULL,        NULL, 2    
3      ,       2, Wall   , NULL, green,  NULL,        NULL, 1

【讨论】:

  • 如果用户以后需要更多字段怎么办?
【解决方案2】:

在您的位置上,首先我创建了一个包含以下字段数据的表:

Field_name  ID_Item  Value
size        2        '10.0'
color       3        'Black'
......

您可以使用构建器模式在房间中创建您的项目。例如,

exec ADD_Black_Door @roomID

此代码可能会向您的房间添加一个项目(门),并使用默认值(Color='Black' 等)在上表中添加所有必填字段。

【讨论】:

  • 在这种情况下,我如何选择所有带有房间字段的项目?请指导
【解决方案3】:

如果我正确理解您的需求,您应该制作三个表格:

房间

room_id | Name (...)
--------------------

物品

item_id | Name (...)
--------------------

ROOMS_ITEMS

room_id | item_id
-------------------

在最后一张表中映射属于房间的项目。

【讨论】:

    【解决方案4】:

    我认为如果您为房间中的每个实体都有一个表格,这将更容易理解,因为这是您想要区分数据值的单位。

    由于在您的情况下,门不是墙,您可以制作这两个单独的表格,然后您可以使用 room_items 作为中间的表格。

    Wall
    ID | layer | color
    
    Window
    ID | Mirror | Type | Size
    

    然后在房间中,由于 item_id 可以指向多个相似的 id,因为每个项目都会创建自己的增量 ID,因此您添加 item_type 用于区分您要查找的元素类型。

    Room 
    room_id | item_id | item_type
    

    【讨论】:

    • 是的,我也是这样做的,但这里我们有两个问题 1) 以后很难选择所有房间项目。我需要条件加入 2)如果用户添加新类型怎么办?我将需要添加新表
    • 1) 是的,这会使查询更加复杂。 2)如果您想完全灵活地更改和添加新类型,为什么不选择 NoSQL 解决方案,例如面向文档的NodeSQL?使用 SQL,您需要有一个预定义的结构,如果您想添加更多未计划的元素,我会考虑重写代码,然后可以更改数据库模式,在这种情况下,您也只需添加一个不会影响其他表的新表。
    • 我是这个级别的新手,我已经提供了数据库,我期待着在它上面工作。请具体说明您要添加哪个表?
    【解决方案5】:

    这里有一个解决方案。 创建表 Room、Room_Item、Item_specification

    房间

    room_id |房间名称

    room_item

    item_id |房间号 |物品名称

    物品规格

    规格 ID |项目 ID |规格名称

    【讨论】:

      【解决方案6】:

      请在两个表之间加入一个表:

      SELECT RI.id, 
             RI.name, 
             RI.room_id, 
             RI.required field, 
             R.id        AS RoomId, 
             R.name      AS RoomType 
      FROM   room_item RI 
             LEFT OUTER JOIN room R 
                          ON R.id = RI.room_id   
      

      【讨论】:

      • 请发布您的预期输出
      • 我想先做架构
      猜你喜欢
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2019-07-30
      • 2013-01-25
      • 2016-02-16
      • 2021-04-27
      相关资源
      最近更新 更多