【问题标题】:How to store multiple values in one field of a MySQL table column?如何在 MySQL 表列的一个字段中存储多个值?
【发布时间】:2015-07-20 14:14:49
【问题描述】:

我想使用这些列 id, name,route, lat, long, arrivaltime 为所有停靠点创建表 stops 但我不知道如何管理它以获取停靠点表中的路线列?因为一条路线有很多号码?

{
   "id": 1
   "stops_name": "Amersham ",
   "route": "8,4,7,34,45,8017, 57, 20,......... 30 entries"
   "arrival_time": {
                    "mon-fri": [ "05:38", "06:07","06:37",.....50 entries],
                    "sat": ["05:34","06:01","06:31",...........50 entries],
                    "son": ["06:02","06:34","07:04",...........50 entries]
                   },
    "stops_lat": 83.837994,
    "stops_long": 18.700423
 }



stt.execute("CREATE TABLE IF NOT EXISTS stops"
        + "(stop_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, "
        + " name varchar(30) NOT NULL, "
        + " route INT(11) NOT NULL, "
        + " lat double(10,6) NOT NULL, "
        + " longi double(10,6)NOT NULL) " );

stt.execute("CREATE TABLE IF NOT EXISTS arrivaltimes(id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,"
        +  " weekday VARCHAR(20) NOT NULL,"
        + "arrivaltime time NOT NULL,"
        + " stop_id INT, FOREIGN KEY fk_stop_id(stop_id) REFERENCES stops(stop_id) )" );

【问题讨论】:

  • 我是 SQL 新手,这就是我发表评论而不回答的原因,但 SQL 列不能包含数组或列表。我的想法是,您会想要创建另一个表,使用 stop 和 route 作为外键并包含单个路由条目,然后链接表。

标签: java mysql sql jdbc


【解决方案1】:

据我了解,您希望创建一个关系数据库结构。并且您希望在停靠点和路线表之间建立关系。

所以假设一个停靠点可以属于多条路线,一条路线可以有多个停靠点,这就是表格之间的多对多关系。

例如,您可以在这里查看 http://www.tutorialspoint.com/hibernate/hibernate_many_to_many_mapping.htm

如何在 Hibernate 中实现这种关系。

【讨论】:

    【解决方案2】:

    这样想。表示这个:

    "route": "8,4,7,34,45,8017, 57, 20,......... 30 entries"
    

    像这样:

    "route": { "8"
             , "4"
             , "7"
             , "34"
             , "45"
             , ...
             }
    

    考虑在这样的表格中表示它:

    CREATE TABLE stop_route 
    ( id       INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
    , stop_id  INT(11) NOT NULL COMMENT 'FK ref stop'
    , route_id INT(11) NOT NULL COMMENT 'FK ref route'
    , UNIQUE_KEY stop_route_UX1 (stop_id, route_id)
    , CONSTRAINT FK_stop_route_stop (stop_id) REFERENCES stop(id)
    , CONSTRAINT FK_stop_route_route (route_id) REFERENCES route(id)
    }
    

    如果 route 不是模型中的实体,则移除外键约束。


    实体-关系模型

    我不知道你的实体关系模型。

    但我怀疑route 和stop 之间实际上存在多对多 关系。为了解决这个问题,我们将引入一个新的“关系”表,其中的外键同时指向“stop”和“route”。

    我认为arrival_time 并不独立于路由。我要问的问题是每个route 在给定的stop 上是否有相同的50 个arrival_time?或者,对于给定的stop,每个route 是否都有自己的一组arrival_time。 (我认为是后者。)

    • route 到达零,一个或多个 stop
    • stop 由零个、一个或多个 route 提供服务

    我们通过引入关系表来解决多对多问题

    route >--- route_stop ---< stop
    

    (个人认为,在命名事物方面,我认为上面的route_stop关系表应该命名为“停止”,而stop实体表应该命名为“位置”。

    按照时间表,在特定的route 上行驶的车辆会在特定的“位置”,在特定的arrival_time(或附近)“停止”。)但这只是命名法。只是取决于你如何命名事物。

    CREATE TABLE route_stop 
    ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    , route_id INT NOT NULL COMMENT 'FK ref route' 
    , stop_id INT NOT NULL COMMENT 'FK ref stop'
    , UNIQUE KEY route_stop_UX1 (route_id, stop_id)
    , CONSTRAINT FK_route_stop_route FOREIGN KEY (route_id) REFERENCES route(id)
    , CONSTRAINT FK_route_stop_stop FOREIGN KEY (stop_id) REFERENCES stop(id)
    )
    
    CREATE TABLE arrival_time 
    ( id            INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
    , stop_route_id INT(11) NOT NULL COMMENT 'FK ref route_stop'
    , weekday     VARCHAR(20) NOT NULL
    , arrivaltime TIME NOT NULL
    , CONSTRAINT FK_arrival_time_stop_route 
        FOREIGN KEY (route_stop_id) REFERENCES stop_route(id)
    )
    

    【讨论】:

    • 感谢您的回答。每条路线都有自己的一套。我正在尝试创建它们,但例如对于 stop_route 表我得到version for the right syntax to use near 'stop_route_UX1 (stop_id, route_id) , CONSTRAINT FK_stop_route_stop (stop_id) RE' at line 5
    • 这是 UNIQUE KEY 而不是 UNIQUE_KEY 我已合作但我现在得到了 MySQL server version for the right syntax to use near '(stop_id) REFERENCES stop(id) , CONSTRAINT FK_stop_route_route (route_id) REFER' at line 6
    • Personally, in terms of naming things, I think the route_stop relationship table above 你的意思是 stop_route above 还是 route_stop below?
    • 我的答案第一部分中的stop_route 表旨在以您拥有的方式表示数据,但将路由列表分解为一个数组(如我所示)。然后使用给定的stop_id 添加到stop_route 的行表示route_id 的数组。我以这种方式命名表,因为它表示“路由”作为stop 的重复属性。我回答的第二部分,我把它转过来了。如果我将 stop 重命名为 loc 并将 route_stop 重命名为 stop 会更清楚。 route 和 stop 之间的 1:M rel.和 1:M rel.在loc 和stop 之间。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2021-01-29
    • 1970-01-01
    相关资源
    最近更新 更多