একটি ডাটাবেসে বাসের রুটগুলি সংরক্ষণ করা


16

আমি কিছু গবেষণা করে দেখেছি যে থামার ক্রম হিসাবে আমার কোনও রুট সংরক্ষণ করা উচিত। কিছুটা এইরকম:

Start -> Stop A -> Stop B -> Stop C -> End

আমি তিনটি টেবিল তৈরি করেছি:

  • রুট
  • স্টপ
  • RouteStops

... যেখানে রুটস্টপগুলি একটি জংশন সারণী।

আমার মতো কিছু আছে:

রুট

+---------+
| routeId |
+---------+
|    1    |
+---------+
|    2    |
+---------+

স্টেশন

+-----------+------+
| stationId | Name |
+-----------+------+
|     1     |   A  |
+-----------+------+
|     2     |   B  |
+-----------+------+
|     3     |   C  |
+-----------+------+
|     4     |   D  |
+-----------+------+

RouteStations

+-------------+---------------+
| routeId(fk) | stationId(fk) |
+-------------+---------------+
|     1       |       A       |
+-------------+---------------+
|     1       |       C       |
+-------------+---------------+
|     1       |       D       |
+-------------+---------------+
|     2       |       A       |
+-------------+---------------+
|     2       |       D       |
+-------------+---------------+

রুট 1 পেরিয়ে যায়

Station A -> Station C -> Station D

রুট 2 দিয়ে যায়

Station A -> Station D

এটি কি রুটগুলি সংরক্ষণ করার ভাল উপায়?

উইকিপিডিয়া অনুসারে :

[...] ডাটাবেস সিস্টেম সারণির কোনও ক্রমানুসারে গ্যারান্টি দেয় না যদি না কোনও ORDER BYধারা উল্লেখ করা হয় [...]

আমি কি এই জাতীয় ডেটাবেস স্কিমার উপর নির্ভর করতে পারি বা এটি অন্যভাবে করা উচিত?

এটি আসলে আমার বিশ্ববিদ্যালয়ের প্রকল্প, তাই আমি কেবল ভাবছি যে এই জাতীয় স্কিমাকে একটি সঠিক হিসাবে বিবেচনা করা যেতে পারে। এই ক্ষেত্রে, আমি সম্ভবত কয়েকটি রুট (প্রায় 3-5) এবং স্টেশনগুলি (প্রায় 10-15) সংরক্ষণ করব, প্রতিটি রুটে প্রায় 5 টি স্টেশন থাকবে। বাস্তব এবং বড় বাস সংস্থার ক্ষেত্রে এটির মতো দেখতে কেমন তা শুনে আমিও আনন্দিত হব।


আপনি সাধারণ ট্রানজিট ফিড নির্দিষ্টকরণটি দেখতে চাইতে পারেন ; যখন জিটিএফএস ফিডগুলি সিএসভি ফাইল হিসাবে আদান-প্রদানের জন্য নির্দিষ্ট করা থাকে, অ্যাপ্লিকেশনগুলি প্রায়শই একটি সম্পর্কিত ডেটাবেসে জিটিএফএস সংরক্ষণ এবং হেরফের করে।
কুর্ট রাশকে

3
আপনার প্রশ্ন 'স্টপ' এবং 'স্টেশন' পদগুলির মধ্যে স্যুইচ করে। আপনার সম্ভবত আপনার ডোমেন ভোকাবুলারিটি স্পষ্ট করা উচিত ( যেমন একটি নাম চয়ন করুন এবং এটির সাথে থাকুন)।
টেরোসোরাসগুলি

@ মনোহ_আই-তেও একই ধরণের প্রশ্ন রয়েছে ডিবিএস্ট্যাকেক্সচেঞ্জ / প্রশ্নগুলি / ১৯৯২২৩/২। আপনার যদি ধারণা থাকে আপনি ভাগ করতে পারেন
দর্শনটি

উত্তর:


19

ডাটাবেস আর্কিটেকচারের দিকে পরিচালিত সমস্ত ব্যবসায়িক বিশ্লেষণের জন্য, আমি বিধিগুলি রচনার পরামর্শ দিই:

  • একটি রুটে ২ বা ততোধিক স্টেশন রয়েছে
  • একটি স্টেশন অনেক রুট দ্বারা ব্যবহার করা যেতে পারে
  • একটি রুটে স্টেশনগুলি একটি নির্দিষ্ট ক্রমে আসে

আপনি লক্ষ্য করেছেন যে 1 ম এবং দ্বিতীয় বিধিগুলি অনেকগুলি সম্পর্কের ক্ষেত্রে অনেকগুলি বোঝায় তাই আপনি রুটস্টেশনগুলি তৈরির জন্য যথাযথ সিদ্ধান্তে পৌঁছেছেন।

তৃতীয় নিয়মটি আকর্ষণীয়। এটি বোঝায় যে প্রয়োজনীয়তার সাথে মানিয়ে নিতে অতিরিক্ত কলামের প্রয়োজন। কোথায় যেতে হবে? আমরা দেখতে পাচ্ছি যে এই সম্পত্তিটি রুট অ্যান্ড স্টেশনের উপর নির্ভর করে। সুতরাং এটি রুট স্টেশনগুলিতে অবস্থিত হওয়া উচিত।

আমি টেবিল রুটের স্টেশনে একটি স্টেশন কলাম যুক্ত করব "স্টেশনআর্ডার"।

+-------------+---------------+---------------
| routeId(fk) | stationId(fk) | StationOrder |
+-------------+---------------+---------------
|     1       |       1       |       3      |
+-------------+---------------+---------------
|     1       |       3       |       1      |
+-------------+---------------+---------------
|     1       |       4       |       2      |
+-------------+---------------+---------------
|     2       |       1       |       1      |
+-------------+---------------+---------------
|     2       |       4       |       2      |
+-------------+---------------+---------------

তারপরে অনুসন্ধান করা সহজ হয়ে যায়:

select rs.routeID,s.Name
from routeStations rs
join
Stations s
on rs.stationId=s.StationId
where rs.routeId=1
order by rs.StationOrder;

+-------------+---------------+
| routeId(fk) | stationId(fk) |
+-------------+---------------+
|     1       |       C       |
+-------------+---------------+
|     1       |       D       |
+-------------+---------------+
|     1       |       A       |
+-------------+---------------+

মন্তব্য:

  1. আমি আমার উদাহরণে রুটস্টেশনগুলিতে স্টেশনআইড স্থির করেছি। আপনি স্টেশন নামটি আইডি হিসাবে ব্যবহার করছেন।
  2. আপনি যদি কোনও রুটের নাম ব্যবহার না করেন তবে রুটআইডের জন্য এমনকি কোনও প্রয়োজন নেই কারণ আপনি রুট স্টেশনগুলি থেকে এটি পেতে পারেন
  3. এমনকি যদি আপনি রুট টেবিলের সাথে লিঙ্ক করেন, আপনার ডাটাবেস অপ্টিমাইজারটি লক্ষ্য করবে যে এটির জন্য অতিরিক্ত লিঙ্কের দরকার নেই এবং কেবল অতিরিক্ত পদক্ষেপগুলি সরিয়ে ফেলতে হবে।

নোট 3 এ বিকাশ করতে, আমি ব্যবহারের কেসটি তৈরি করেছি:

এটি ওরাকল 12 সি এন্টারপ্রাইজ।

দ্রষ্টব্য যে নীচে কার্যকরকরণ পরিকল্পনায় এই টেবিলের রুটগুলি মোটেই ব্যবহৃত হয় না। কাস্টম বেস অপ্টিমাইজার (সিবিও) জানেন যে এটি রুটস্টেশনগুলির প্রাথমিক কী থেকে সরাসরি পদক্ষেপটি পেতে পারে (পদক্ষেপ 5, ROUTESTATIONS_PK- এ INDEX রেঞ্জ স্ক্যান, প্রডিকেট ইনফরমেশন 5 - অ্যাক্সেস ("আরএস"। "রুটইআইডি" = 1))

--Table ROUTES
create sequence routeId_Seq start with 1 increment by 1 maxvalue 9999999999999 cache 1000;

CREATE TABLE routes
(
  routeId  INTEGER NOT NULL
);


ALTER TABLE routes ADD (
  CONSTRAINT routes_PK
  PRIMARY KEY
  (routeId)
  ENABLE VALIDATE);

insert into routes values (routeId_Seq.nextval);
insert into routes values (routeId_Seq.nextval);
commit;

--TABLE STATIONS  
create sequence stationId_seq start with 1 increment by 1 maxvalue 9999999999999 cache 1000;

create table stations(
   stationID INTEGER NOT NULL,
   name varchar(50) NOT NULL
);

ALTER TABLE stations ADD (
  CONSTRAINT stations_PK
  PRIMARY KEY
  (stationId)
  ENABLE VALIDATE);

insert into stations values (stationId_seq.nextval,'A');
insert into stations values (stationId_seq.nextval,'B');
insert into stations values (stationId_seq.nextval,'C');
insert into stations values (stationId_seq.nextval,'D');
commit;
--

--Table ROUTESTATIONS 
CREATE TABLE routeStations
(
  routeId       INTEGER NOT NULL,
  stationId     INTEGER NOT NULL,
  stationOrder  INTEGER NOT NULL
);


ALTER TABLE routeStations ADD (
  CONSTRAINT routeStations_PK
  PRIMARY KEY
  (routeId, stationId)
  ENABLE VALIDATE);

ALTER TABLE routeStations ADD (
  FOREIGN KEY (routeId) 
  REFERENCES ROUTES (ROUTEID)
  ENABLE VALIDATE,
  FOREIGN KEY (stationId) 
  REFERENCES STATIONS (stationId)
  ENABLE VALIDATE);

insert into routeStations values (1,1,3);
insert into routeStations values (1,3,1);
insert into routeStations values (1,4,2);
insert into routeStations values (2,1,1);
insert into routeStations values (2,4,2);
commit;

explain plan for select rs.routeID,s.Name
from ndefontenay.routeStations rs
join
ndefontenay.routes r
on r.routeId=rs.routeId
join ndefontenay.stations s
on rs.stationId=s.stationId
where rs.routeId=1
order by rs.StationOrder;

set linesize 1000
set pages 500
select * from table (dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 2617709240                                                                                                                                                                                                                                                                                 

---------------------------------------------------------------------------------------------------                                                                                                                                                                                                         
| Id  | Operation                      | Name             | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                                                         
---------------------------------------------------------------------------------------------------                                                                                                                                                                                                         
|   0 | SELECT STATEMENT               |                  |     1 |    79 |     1 (100)| 00:00:01 |                                                                                                                                                                                                         
|   1 |  SORT ORDER BY                 |                  |     1 |    79 |     1 (100)| 00:00:01 |                                                                                                                                                                                                         
|   2 |   NESTED LOOPS                 |                  |       |       |            |          |                                                                                                                                                                                                         
|   3 |    NESTED LOOPS                |                  |     1 |    79 |     0   (0)| 00:00:01 |                                                                                                                                                                                                         
|   4 |     TABLE ACCESS BY INDEX ROWID| ROUTESTATIONS    |     1 |    39 |     0   (0)| 00:00:01 |                                                                                                                                                                                                         
|*  5 |      INDEX RANGE SCAN          | ROUTESTATIONS_PK |     1 |       |     0   (0)| 00:00:01 |                                                                                                                                                                                                         
|*  6 |     INDEX UNIQUE SCAN          | STATIONS_PK      |     1 |       |     0   (0)| 00:00:01 |                                                                                                                                                                                                         
|   7 |    TABLE ACCESS BY INDEX ROWID | STATIONS         |     1 |    40 |     0   (0)| 00:00:01 |                                                                                                                                                                                                         
---------------------------------------------------------------------------------------------------                                                                                                                                                                                                         

Predicate Information (identified by operation id):                                                                                                                                                                                                                                                         
---------------------------------------------------                                                                                                                                                                                                                                                         

   5 - access("RS"."ROUTEID"=1)                                                                                                                                                                                                                                                                             
   6 - access("RS"."STATIONID"="S"."STATIONID")

এখন মজাদার অংশ, আসুন রুট টেবিলটিতে একটি কলামের নাম যুক্ত করা যাক। এখন একটি কলাম রয়েছে যা আমাদের "রুটে" আসলে দরকার। সিবিও 1 টি রুটের সারিটি সন্ধান করতে সূচকটি ব্যবহার করে, তারপরে সারণীটি অ্যাক্সেস করে (সূচি রোডইড দ্বারা সারণী অ্যাক্সেস) এবং "রুট.নেম" কলামটি ধরে।

ALTER TABLE ROUTES
 ADD (name  VARCHAR2(50));

update routes set name='Old Town' where routeId=1;
update routes set name='North County' where routeId=2;
commit;

explain plan for select r.name as routeName,s.Name as stationName
from routeStations rs
join
routes r
on r.routeId=rs.routeId
join stations s
on rs.stationId=s.stationId
where rs.routeId=1
order by rs.StationOrder;

set linesize 500
set pages 500
select * from table (dbms_xplan.display);

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
---------------------------------------------------------------------------------------------------
Plan hash value: 3368128430                                                                                                                                                                                                                                                                                 

----------------------------------------------------------------------------------------------------                                                                                                                                                                                                        
| Id  | Operation                       | Name             | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                                                        
----------------------------------------------------------------------------------------------------                                                                                                                                                                                                        
|   0 | SELECT STATEMENT                |                  |     1 |   119 |     1 (100)| 00:00:01 |                                                                                                                                                                                                        
|   1 |  SORT ORDER BY                  |                  |     1 |   119 |     1 (100)| 00:00:01 |                                                                                                                                                                                                        
|   2 |   NESTED LOOPS                  |                  |       |       |            |          |                                                                                                                                                                                                        
|   3 |    NESTED LOOPS                 |                  |     1 |   119 |     0   (0)| 00:00:01 |                                                                                                                                                                                                        
|   4 |     NESTED LOOPS                |                  |     1 |    79 |     0   (0)| 00:00:01 |                                                                                                                                                                                                        
|   5 |      TABLE ACCESS BY INDEX ROWID| ROUTES           |     1 |    40 |     0   (0)| 00:00:01 |                                                                                                                                                                                                        
|*  6 |       INDEX UNIQUE SCAN         | ROUTES_PK        |     1 |       |     0   (0)| 00:00:01 |                                                                                                                                                                                                        
|   7 |      TABLE ACCESS BY INDEX ROWID| ROUTESTATIONS    |     1 |    39 |     0   (0)| 00:00:01 |                                                                                                                                                                                                        
|*  8 |       INDEX RANGE SCAN          | ROUTESTATIONS_PK |     1 |       |     0   (0)| 00:00:01 |                                                                                                                                                                                                        
|*  9 |     INDEX UNIQUE SCAN           | STATIONS_PK      |     1 |       |     0   (0)| 00:00:01 |                                                                                                                                                                                                        
|  10 |    TABLE ACCESS BY INDEX ROWID  | STATIONS         |     1 |    40 |     0   (0)| 00:00:01 |                                                                                                                                                                                                        
----------------------------------------------------------------------------------------------------                                                                                                                                                                                                        

Predicate Information (identified by operation id):                                                                                                                                                                                                                                                         
---------------------------------------------------                                                                                                                                                                                                                                                         

   6 - access("R"."ROUTEID"=1)                                                                                                                                                                                                                                                                              
   8 - access("RS"."ROUTEID"=1)                                                                                                                                                                                                                                                                             
   9 - access("RS"."STATIONID"="S"."STATIONID")      

@ নিকোলাস.আই-তেও একই ধরণের প্রশ্ন রয়েছে আপনি আমাকে সাহায্য করতে পারেন dba.stackexchange.com/questions/194223/…
দর্শন

3

আপনি ঠিক বলেছেন, একটি সম্পর্কিত টেবিলের মধ্যে রেকর্ডের অন্তর্নিহিত ক্রম নেই। এর অর্থ আপনাকে প্রতিটি রুটের অভ্যন্তরে অর্ডার দেওয়ার কয়েকটি স্পষ্ট উপায় সরবরাহ করতে হবে।

আপনি কীভাবে ডেটা অ্যাক্সেস করার পরিকল্পনা করছেন তার উপর নির্ভরশীল

  1. যোগ sequenceNumberকলামেRouteStationsসংরক্ষণ জন্য , স্পষ্টতই, প্রতিটি রুটে প্রতিটি স্টেশনের ক্রম।
  2. nextStationIdপ্রতিটি রুটে পরবর্তী স্টেশনে একটি "পয়েন্টার" সঞ্চয় করতে কলাম যুক্ত করুন ।

@ mustaccio.i তেও একই ধরণের প্রশ্ন রয়েছে আপনি আমাকে সহায়তা করতে পারেন dba.stackexchange.com/questions/194223/…
দর্শন

0

আমি এ সম্পর্কে কাউকে কিছু জানাতে দেখিনি তাই আমি ভেবেছিলাম আপনার গ্রেডের জন্য আমি যুক্ত করব। আমি তিনটি কলাম জুড়েই একটি নন-ক্লাস্টারযুক্ত অনন্য সূচক (আপনার আরডিবিএমএসের উপর নির্ভর করে) রুটস্টেশন / রাউটস্টপস টেবিলের উপরে রাখব। এইভাবে আপনি ভুল করতে পারবেন না এবং বাসটি পরবর্তী 2 টি স্টেশনে যাবেন। এটি আপডেটের জন্য আরও শক্ত করে তুলবে তবে আমি মনে করি এখনও একটি ভাল ডিজাইনের অংশ হিসাবে বিবেচনা করা উচিত।


-1

আমি একটি হিসাবে কথা বলছি অ্যাপ্লিকেশন প্রোগ্রামার :

এমনকি ডেটাবেসের বিরুদ্ধে প্রশ্নগুলির সাথে রাউটিং বা টাইম টেবলিংয়ের কথা ভাবেন না (বা কোনও সঞ্চিত প্রকল্পে) এটি কখনই যথেষ্ট দ্রুত হবে না। ( যদি না এটি কেবল একটি "হোমওয়ার্ক" সমস্যা হয় ))

এমনকি এমন কোনও অ্যাপ্লিকেশনের জন্য যা ডেটাবেস থেকে ডেটা লোড করে মেমরির ডেটা প্রক্রিয়াকরণ না করা ততক্ষণে দ্রুত হবে না যতক্ষণ না সমস্ত ডেটা শুরু করার সময় লোড হয়, বা ডেটাটি ডিওমোরালাইজড আকারে সংরক্ষণ করা হয়। ডেটা ডেমোরালাইজড হয়ে গেলে রিলেশনাল ডেটাবেস ব্যবহারের সামান্যতম বিন্দু থাকে।

অতএব আমি ডাটাবেসটিকে ডেটাটির "মাস্টার" অনুলিপি হিসাবে ভাবব এবং স্বীকার করব যে আমি এটি অ্যাপ্লিকেশন মেমরিতে প্রাক প্রক্রিয়াজাতকরণে বা মেম্বেসের মতো নগদকরণের সার্ভারেও সংরক্ষণ করতে হবে।

ndefontenay এর উত্তর একটি সূচনা পয়েন্ট হিসাবে একটি ভাল টেবিল নকশা দেয়, কিন্তু আপনি বিবেচনা করতে হবে যে রুটগুলি দিনের সময়ের উপর নির্ভর করে বিভিন্ন সময় এবং সময়, সপ্তাহের দিন, এমনকি স্কুল ছুটির উপর নির্ভর করে বিভিন্ন স্টপ থাকে different


5
তিনি রাউটিং বা টাইম টেবিলিং করতে চান বলে কোথাও উল্লেখ নেই; তিনি জিজ্ঞাসা করেন কীভাবে কোনও ডিবিতে রুটগুলি সংরক্ষণ করবেন । এছাড়াও, যখন কোনও প্রোগ্রামার হতাশায়িত হতে পারে, তখন আমি নিশ্চিত আশা করি যে কোনও সময় ডেটাটি (ডি-) স্বাভাবিক হবে। :)
AnoE
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.