আরডিবিএমএস কেন নেস্টেড ফর্ম্যাটে যোগদানের টেবিলগুলি ফেরত দেয় না?


14

উদাহরণস্বরূপ, বলুন আমি কোনও ব্যবহারকারী এবং তার সমস্ত ফোন নম্বর এবং ইমেল ঠিকানা আনতে চাই। ফোন নম্বর এবং ইমেলগুলি পৃথক টেবিলগুলিতে সংরক্ষণ করা হয়, একাধিক ফোন / ইমেলের এক ব্যবহারকারী। আমি এটি বেশ সহজেই করতে পারি:

SELECT * FROM users user 
    LEFT JOIN emails email ON email.user_id=user.id
    LEFT JOIN phones phone ON phone.user_id=user.id

এর সাথে সমস্যা * এটি হ'ল এটি ব্যবহারকারীর নাম, ডিওবি, প্রিয় রঙ এবং প্রতিটি টেবিলে ব্যবহারকারীর টেবিলে সঞ্চিত সমস্ত অন্যান্য তথ্য (ব্যবহারকারীদের ইমেল ফোনের রেকর্ডে) সম্ভবত ব্যান্ডউইথ খায় এবং ধীর করে দেয় ফলাফল নিচে।

এটা সুন্দর হবে না যদি এটা প্রত্যেক ব্যবহারকারীর জন্য অবশ্যই একটি একক সারি ফিরে, এবং যে রেকর্ড মধ্যে একটি ছিল তালিকা এবং ইমেল একটি তালিকা ফোনের? এটি ডেটা দিয়ে কাজ করা আরও সহজ করে তুলবে।

আমি জানি আপনি লিনকিউ বা সম্ভবত অন্যান্য ফ্রেমওয়ার্ক ব্যবহার করে এর মতো ফলাফল পেতে পারেন তবে এটি সম্পর্কিত রিটার্নাল ডেটাবেসের অন্তর্নিহিত নকশায় দুর্বলতা বলে মনে হচ্ছে।

আমরা নোএসকিউএল ব্যবহার করে এটি পেতে পারি, তবে কোনও মাঝারি স্থলটি থাকা উচিত নয়?

আমি কিছু অনুপস্থিত করছি? কেন এর অস্তিত্ব নেই?

* হ্যাঁ, এটি এইভাবে ডিজাইন করা হয়েছে। আমি এটা পাই. আমি ভাবছি কেন এমন বিকল্প নেই যার সাথে কাজ করা সহজ। এসকিউএল এটি যা করছে তা করে রাখতে পারে তবে তারপরে তারা কিছু বা কিছু কীওয়ার্ড যুক্ত করতে পারে পোস্ট-প্রসেসিংয়ের কিছুটা যা কোনও কার্তেসিয়ান পণ্যের পরিবর্তে নেস্টেড ফর্ম্যাটে ডেটা ফেরত দেয় returns

আমি জানি এটি আপনার পছন্দের স্ক্রিপ্টিং ভাষায় করা যেতে পারে, তবে এটির প্রয়োজন যে এসকিউএল সার্ভারটি হয় নিরপেক্ষ ডেটা প্রেরণ করে (নীচে উদাহরণস্বরূপ) অথবা আপনি একাধিক প্রশ্ন ইস্যু করতে পারেন SELECT email FROM emails WHERE user_id IN (/* result of first query */)


মাইএসকিউএল পরিবর্তে এর মতো কিছু ফিরিয়ে আনুন:

[
    {
        "name": "John Smith",
        "dob": "1945-05-13",
        "fav_color": "red",
        "email": "johnsmith45@gmail.com",
    },
    {
        "name": "John Smith",
        "dob": "1945-05-13",
        "fav_color": "red",
        "email": "john@smithsunite.com",
    },
    {
        "name": "Jane Doe",
        "dob": "1953-02-19",
        "fav_color": "green",
        "email": "originaljane@deerclan.com",
    }
]

এবং তারপরে ফলাফলটি কীভাবে চান তা পুনরায় ফর্ম্যাট করতে ক্লায়েন্ট-সাইডটি কিছু অনন্য শনাক্তকারী (যার অর্থ আমার এটিও আনতে হবে!) এর সাথে দলবদ্ধ হওয়া, কেবল এটি ফিরিয়ে দিন:

[
    {
        "name": "John Smith",
        "dob": "1945-05-13",
        "fav_color": "red",
        "emails": ["johnsmith45@gmail.com", "john@smithsunite.com"]
    },
    {
        "name": "Jane Doe",
        "dob": "1953-02-19",
        "fav_color": "green",
        "emails": ["originaljane@deerclan.com"],
    }
]

বিকল্পভাবে, আমি 3 টি প্রশ্ন ইস্যু করতে পারি: ব্যবহারকারীর জন্য 1, ইমেলগুলির জন্য 1, এবং ফোন নম্বরগুলির জন্য 1, তবে ইমেল এবং ফোন নম্বর ফলাফল সেটগুলিতে ব্যবহারকারী_আইড থাকা দরকার যাতে আমি তাদের সাথে ব্যাক আপ ব্যবহার করতে পারি আমি আগে নিয়ে এসেছি। আবার, অপ্রয়োজনীয় ডেটা এবং অপ্রয়োজনীয় পোস্ট-প্রসেসিং।


6
মাইক্রোসফ্ট এক্সেলের মতো এসকিউএলকে একটি স্প্রেডশিট হিসাবে ভাবেন, তারপরে কীভাবে অভ্যন্তরীণ কোষগুলি রয়েছে এমন কোনও সেল মান তৈরি করবেন তা নির্ধারণের চেষ্টা করুন। এটি আর স্প্রেডশিট হিসাবে ভাল কাজ করে না। আপনি যা খুঁজছেন তা একটি গাছের কাঠামো, তবে তারপরে আপনার আর স্প্রেডশিটের সুবিধা নেই (যেমন আপনি কোনও গাছের কলামটি মোট দিতে পারবেন না)। গাছের কাঠামো খুব মানব পাঠযোগ্য রিপোর্টের জন্য তৈরি করে না।
আয়তাকার

54
এসকিউএল তথ্য ফিরিয়ে দেওয়া খারাপ নয়, আপনি যা চান তার জন্য অনুসন্ধান করতে আপনি খারাপ bad থাম্বের নিয়ম হিসাবে, আপনি যদি ভাবেন যে একটি বহুল ব্যবহৃত সরঞ্জাম সাধারণ ব্যবহারের ক্ষেত্রে বগী বা ভেঙে গেছে তবে সমস্যাটি আপনি।
শান ম্যাকসোমিংথিং

12
@ সানম্যাকসোমিংথিং এতটা সত্য যে এটি ব্যাথা করে, আমি নিজে এটি আরও ভাল বলতে পারতাম না।
ওয়ার্নারসিডি

5
এটি একটি দুর্দান্ত প্রশ্ন। যে উত্তরগুলি "এটি এইভাবে এটি" বলছে সেগুলির বিন্দুটি অনুপস্থিত। সারিগুলির এম্বেড থাকা সংগ্রহের সাহায্যে কেন সারিগুলি ফেরানো সম্ভব নয়?
ক্রিস পিটম্যান

8
@ সিয়ানম্যাকসোমিংথিং: যদি না ব্যাপকভাবে ব্যবহৃত সরঞ্জাম সি ++ বা পিএইচপি না হয় তবে সেক্ষেত্রে আপনি সম্ভবত সঠিক। ;)
ম্যাসন হুইলার

উত্তর:


11

গভীরভাবে ডাউন, কোনও সম্পর্কিত ডেটাবেস, তার সমস্ত সারি এবং কলামগুলির সাহসে। এটি এমন একটি কাঠামো যা একটি রিলেশনাল ডাটাবেসের সাথে কাজ করতে অনুকূলিত হয়। কার্সাররা একসাথে স্বতন্ত্র সারিগুলিতে কাজ করে। কিছু অপারেশন অস্থায়ী সারণী তৈরি করে (আবার এটির সারি এবং কলাম হওয়া দরকার)।

কেবল সারিগুলির সাথে কাজ করে এবং কেবল সারিগুলিতে ফিরে আসার মাধ্যমে, সিস্টেম মেমরি এবং নেটওয়ার্ক ট্র্যাফিকের সাথে আরও ভালভাবে ডিল করতে সক্ষম হয়।

যেমনটি উল্লেখ করা হয়েছে, এটি নির্দিষ্ট অপ্টিমাইজেশানগুলি করার জন্য অনুমতি দেয় (সূচী, যোগদান, ইউনিয়ন ইত্যাদি ...)

যদি কেউ নেস্টেড ট্রি স্ট্রাকচার চান, তবে এটির প্রয়োজন হয় যে একবারে সমস্ত ডেটা টান । ডাটাবেস সাইডে কার্সারগুলির জন্য অপটিমাইজেশন হয়েছে। তেমনি, নেটওয়ার্কের উপর দিয়ে ট্র্যাফিক একটি বড় ফাটলে পরিণত হয় যা সারি সারি সারি ধীর গতির চেয়ে অনেক বেশি সময় নিতে পারে (এটি এমন একটি বিষয় যা মাঝেমধ্যে আজকের ওয়েব জগতে হারিয়ে যায়)।

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

প্রোগ্রামিং ভাষার পক্ষে সারিগুলিকে অন্য কোনও কাঠামোতে রূপান্তর করা এতটা কঠিন নয়। এটি একটি গাছ বা একটি হ্যাশ সেট তৈরি করুন বা সারিগুলির তালিকা হিসাবে ছেড়ে দিন যা আপনি পুনরাবৃত্তি করতে পারেন।

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

এবং যদিও আজকের ভাষাগুলি পুনরাবৃত্তি এবং আরও উন্নত ডেটা ধরণের জন্য সমর্থন করে, জিনিসগুলি পরিবর্তনের জন্য আসলেই কোনও ভাল কারণ নেই। তারা কাজ করে, এবং তারা ভাল কাজ করে। বেশী যে হয় কিছু পরিবর্তন nosql ডাটাবেস আছে। আপনি দলিল ভিত্তিতে একটি নথিতে গাছ সংরক্ষণ করতে পারেন। এলডিএপি (এটি আসলে পুরানো) এটিও একটি ট্রি ভিত্তিক সিস্টেম (যদিও এটি সম্ভবত আপনার পরে নয়)। কে জানে, nosql ডাটাবেসগুলির পরবর্তী জিনিসটি এমন হবে যা জাসন অবজেক্ট হিসাবে কোয়েরিটি ফিরিয়ে দেয়।

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

  1. প্রোটোকল ডিজাইনে, যখন যোগ করার মতো কিছুই থাকে না তখন সিদ্ধি পৌঁছে যায়, তবে যখন কিছুই নিয়ে যায় না।

আরএফসি 1925 থেকে - বারোটি নেটওয়ার্কিংয়ের সত্যতা


"যদি কেউ কোনও নেস্টেড ট্রি স্ট্রাকচার চান, তবে এটির জন্য প্রয়োজনীয় যে সমস্ত ডেটা একবারে টেনে নেয় database ডাটাবেস সাইডে কার্সারগুলির জন্য অপ্টিমাইজেশন হয়েছে" " - এটা সত্য শোনাচ্ছে না। এটিতে কেবল কয়েকটি সংখ্যক কার্সার বজায় রাখতে হবে: মূল টেবিলের জন্য একটি এবং তারপরে প্রতিটি যোগদানের টেবিলের জন্য একটি। ইন্টারফেসের উপর নির্ভর করে, এটি এক সারি এবং সমস্ত সংযুক্ত টেবিলগুলি একটি অংশে (আংশিকভাবে প্রবাহিত) ফিরে আসতে পারে বা আপনি সেগুলি পুনরাবৃত্তি করা শুরু না করা অবধি সাবট্রিজগুলি (এবং সম্ভবত তাদের জিজ্ঞাসাও করবেন না) প্রবাহিত করতে পারে। তবে হ্যাঁ, এটি জিনিসগুলিকে অনেক জটিল করে তুলছে।
এমপেন

3
প্রতিটি আধুনিক ভাষায় গাছের শ্রেণি এক ধরণের হওয়া উচিত, না? এবং ড্রাইভার এটি মোকাবেলা করা হবে না? আমার ধারণা, এসকিউএল ছেলেরা এখনও একটি সাধারণ ফর্ম্যাট ডিজাইন করতে হবে (এটি সম্পর্কে খুব বেশি কিছু জানেন না)। আমাকে যে জিনিসটি পেয়েছে তা হ'ল আমাকে হয় যোগ দেওয়ার সাথে সাথে 1 টি ক্যোয়ারী প্রেরণ করতে হবে এবং ফিরে এসে রিডানড্যান্ট ডেটা ফিল্টার করতে হবে যা প্রতিটি সারিতে (ব্যবহারকারীর তথ্য, যা কেবলমাত্র প্রতিটি Nth সারি পরিবর্তন করে), বা 1 টি ক্যোয়ারী (ব্যবহারকারী) জারি করে , এবং ফলাফলগুলি লুপ করুন, তারপরে আমার প্রয়োজনীয় তথ্য আনতে প্রতিটি রেকর্ডের জন্য আরও দুটি প্রশ্ন (ইমেল, ফোন) প্রেরণ করুন। উভয় পদ্ধতিই অপব্যয় বলে মনে হচ্ছে।
এমপেন

51

এটি আপনি যা চেয়েছিলেন ঠিক তা ফিরিয়ে দিচ্ছে: যোগদান করে সংজ্ঞায়িত কার্টেসিয়ান পণ্য সম্বলিত একটি একক রেকর্ড সেট। এখানে প্রচুর বৈধ পরিস্থিতি রয়েছে যেখানে আপনি যা চাইবেন ঠিক তাই, এসকিউএল একটি খারাপ ফল দিচ্ছে (এবং এইভাবে বোঝানো হচ্ছে যে আপনি এটি পরিবর্তন করলে এটি আরও ভাল হবে) আসলে অনেকগুলি প্রশ্ন অনুসন্ধান করবে।

আপনি যে বিষয়টির মুখোমুখি হচ্ছেন তা " অবজেক্ট / রিলেশনাল ইমপিডেন্স মিস্যাচ্যাচ " নামে পরিচিত , প্রযুক্তিগত অসুবিধাগুলি যা এই বিষয় থেকে উদ্ভূত হয় যে অবজেক্ট-ওরিয়েন্টেড ডেটা মডেল এবং রিলেশনাল ডেটা মডেল বিভিন্ন উপায়ে মৌলিকভাবে পৃথক। লিনকুই এবং অন্যান্য ফ্রেমওয়ার্ক (ওআরএম, অবজেক্ট / রিলেশনাল ম্যাপারস হিসাবে পরিচিত, কাকতালীয়ভাবে নয়) জাদুকরভাবে "এটিকে ঘিরে ধরুন না;" তারা কেবল বিভিন্ন প্রশ্নের ইস্যু করে। এটি এসকিউএল-তেও করা যায়। আমি এটি কীভাবে করব তা এখানে:

SELECT * FROM users user where [criteria here]

ব্যবহারকারীর তালিকাটি সনাক্ত করুন এবং আইডিগুলির একটি তালিকা তৈরি করুন।

SELECT * from EMAILS where user_id in (list of IDs here)
SELECT * from PHONES where user_id in (list of IDs here)

এবং তারপরে আপনি যোগদানকারী ক্লায়েন্ট-সাইডটি করেন। লিনকিউ এবং অন্যান্য ফ্রেমওয়ার্কগুলি এটি করে। এর সাথে সত্যিকারের জাদু জড়িত নেই; বিমূর্ততার মাত্র একটি স্তর।


14
"আপনি যা চেয়েছিলেন ঠিক" এর জন্য +1। প্রায়শই আমরা এই সিদ্ধান্তে পৌঁছে যাই যে প্রযুক্তিটি কার্যকরভাবে কীভাবে ব্যবহার করতে হয় তা আমাদের শিখতে হবে এমন সিদ্ধান্তে বরং প্রযুক্তির মধ্যে কিছু ভুল রয়েছে।
ম্যাট

1
এই সংগ্রহগুলির জন্য আগ্রহী আনার মোডটি ব্যবহার করা হলে হাইবারনেট একটি একক প্রশ্নে মূল সত্তা এবং নির্দিষ্ট সংগ্রহগুলি পুনরুদ্ধার করবে ; সেক্ষেত্রে এটি মেমরিতে রুট সত্তার বৈশিষ্ট্য হ্রাস করে। অন্যান্য ওআরএম সম্ভবত এটি করতে পারে।
মাইক পার্টরিজ

3
আসলে এটি সম্পর্কের মডেলটির জন্য দোষারোপ নয়। এটি নেস্টেড সম্পর্কের সাথে খুব সুন্দরভাবে ক্যাপস আপনাকে ধন্যবাদ। এটি সম্পূর্ণরূপে এসকিউএল এর প্রাথমিক সংস্করণগুলিতে একটি বাস্তবায়ন বাগ। আমি মনে করি আরও সাম্প্রতিক সংস্করণগুলি এটি যুক্ত করেছে।
জন নিলসন

8
আপনি কি নিশ্চিত যে এটি অবজেক্ট-রিলেশনাল প্রতিবন্ধকতার একটি উদাহরণ? আমার কাছে মনে হয় যে সম্পর্কিত মডেলটি ওপির ধারণাগত ডেটা মডেলের সাথে পুরোপুরি মেলে: প্রতিটি ব্যবহারকারীর শূন্য, এক বা একাধিক ইমেল ঠিকানাগুলির তালিকার সাথে যুক্ত। এই মডেলটি ওও দৃষ্টান্তেও পুরোপুরি ব্যবহারযোগ্য (সমষ্টি: ব্যবহারকারী সামগ্রীর ইমেলের সংগ্রহ রয়েছে)। সীমাবদ্ধতাটি সেই ডাটাবেসে ক্যোয়ারী করার কৌশলটিতে রয়েছে যা একটি বাস্তবায়ন বিশদ। চারপাশে এমন কোয়েরি কৌশল রয়েছে যার চারপাশে উত্তরাধিকারী
উত্তরাধিকারী ডেটাসেটস

@ মারকজে আপনার উত্তর হিসাবে এটি লেখা উচিত।
মিঃমাইন্ডার

12

আপনি একসাথে রেকর্ডগুলি একত্রিত করতে একটি বিল্ট ইন ফাংশন ব্যবহার করতে পারেন। মাইএসকিউএল এ আপনি GROUP_CONCAT()ফাংশনটি ব্যবহার করতে পারেন এবং ওরাকলে আপনি LISTAGG()ফাংশনটি ব্যবহার করতে পারেন ।

মাইএসকিউএলে কোনও ক্যোয়ারী কেমন দেখতে পারে তার একটি নমুনা এখানে:

SELECT user.*, 
    (SELECT GROUP_CONCAT(DISTINCT emailAddy) FROM emails email WHERE email.user_id = user.id
    ) AS EmailAddresses,
    (SELECT GROUP_CONCAT(DISTINCT phoneNumber) FROM phones phone WHERE phone.user_id = user.id
    ) AS PhoneNumbers
FROM users user 

এটি কিছু ফিরে আসবে

username    department       EmailAddresses                        PhoneNumbers
Tim_Burton  Human Resources  hr@m.com, tb@me.com, nunya@what.com   231-123-1234, 231-123-1235

এটি ওপি যা করার চেষ্টা করছে তার নিকটতম সমাধান (এসকিউএল মধ্যে) বলে মনে হচ্ছে। ইমেল ঠিকানাগুলি এবং ফোন নম্বরগুলি তালিকাগুলির ফলগুলি ভেঙে ফেলার জন্য তাকে সম্ভবত ক্লায়েন্ট সাইড প্রসেসিং করতে হবে।
মিঃমিন্দর

2
যদি ফোন নম্বরটিতে "সেল", "হোম" বা "কাজ" এর মতো "প্রকার" থাকে? তদতিরিক্ত, ইমেল ঠিকানাগুলিতে কমাগুলি প্রযুক্তিগতভাবে অনুমোদিত হয় (যদি সেগুলি উদ্ধৃত হয়) - তবে আমি কীভাবে এটি বিভক্ত করব?
এমপিএন

10

এটির সাথে সমস্যাটি হ'ল এটি ব্যবহারকারীর নাম, ডিওবি, প্রিয় রঙ এবং সঞ্চিত অন্যান্য সমস্ত তথ্য ফিরিয়ে দিচ্ছে

সমস্যাটি হ'ল আপনি যথেষ্ট নির্বাচন করছেন না। আপনি যখন বলেছিলেন তখন আপনি সবকিছু চেয়েছিলেন

Select * from...

... এবং আপনি এটি পেয়েছেন (ডিওবি এবং প্রিয় রঙ সহ)।

আপনার সম্ভবত আরও কিছুটা হওয়া উচিত (আহেমে) ... বেছে বেছে, এবং এরকম কিছু বলেছিলেন:

select users.name, emails.email_address, phones.home_phone, phones.bus_phone
from...

এটি সম্ভবত আপনি রেকর্ডগুলি দেখতে পাবেন যা সদৃশগুলির মতো দেখায় কারণ কোনও userএকাধিক emailরেকর্ডে যোগ দিতে পারে তবে ক্ষেত্র যা এই দুটিকে আলাদা করে আপনার Selectবিবৃতিতে নেই, তাই আপনি কিছু বলতে চাইবেন

select distinct users.name, emails.email_address, phones.home_phone, phones.bus_phone
from...

... প্রতিটি রেকর্ডের জন্য আবারও ...

এছাড়াও, আমি লক্ষ্য করছি আপনি একটি করছেন LEFT JOIN। এটি যোগদানের বামে সমস্ত রেকর্ডে যুক্ত হবে (অর্থাত্ users) ডানদিকে সমস্ত রেকর্ডে বা অন্য কথায়:

একটি বাম বাহ্যিক জোড় ডান টেবিলের সাথে মেলে না এমন বাম টেবিলের সমস্ত মান অভ্যন্তরীণ জোড় থেকে সমস্ত মান প্রদান করে।

( http://en.wikedia.org/wiki/Join_(SQL)# বাম_উত্তর_জয়াইন )

সুতরাং আরেকটি প্রশ্ন হ'ল আপনার কি আসলে বাম যোগ হওয়া দরকার , নাকি INNER JOINযথেষ্ট ছিল? এরা খুব আলাদা ধরণের যোগদান করে।

এটি প্রতিটি ব্যবহারকারীর জন্য একটি একক সারি ফেরত দিলে ভাল লাগবে না, এবং সেই রেকর্ডের মধ্যে ইমেলের একটি তালিকা ছিল

আপনি যদি ফলাফলের মধ্যে কোনও একক কলামে অন-দ্য ফ্লাইয়ে তৈরি হওয়া একটি তালিকা অন্তর্ভুক্ত রাখতে চান তবে তা করা যেতে পারে তবে আপনি কোন ডাটাবেসটি ব্যবহার করছেন তার উপর নির্ভর করে এটি পরিবর্তিত হয়। ওরাকলের listaggকাজ রয়েছে


শেষ পর্যন্ত, আমি মনে করি আপনি যদি এই জাতীয় কিছুটির কাছে আপনার ক্যোয়ারীটি পুনরায় লেখেন তবে আপনার সমস্যার সমাধান হতে পারে:

select distinct users.name, users.id, emails.email_address, phones.phone_number
from users
  inner join emails on users.user_id = emails.user_id
  inner join phones on users.user_id = phones.user_id

1
* ব্যবহার করা নিরুৎসাহিত করা হয় তবে তার সমস্যার সমাধান হয় না। এমনকি যদি তিনি 0 টি ব্যবহারকারী কলাম নির্বাচন করেন তবে তিনি এখনও একটি অনুলিপি প্রভাব অনুভব করতে পারেন যেহেতু ফোন এবং ইমেল উভয়ই ব্যবহারকারীর সাথে একাধিক সম্পর্ক রয়েছে। স্বতন্ত্রভাবে একটি ফোন নম্বর আলা ফোন1/name@hotmail.com, phone1/name@google.com এ দু'বার উপস্থিত হতে বাধা দেয় না।
মাইকে 30

6
-1: "আপনার সমস্যার সমাধান হতে পারে" বলে যে আপনি কী জানেন যে কী প্রভাব থেকে পরিবর্তিত left joinহবে inner join। এই ক্ষেত্রে, এটি ব্যবহারকারী "পুনরাবৃত্তি" হ্রাস করবে না; এটি কেবল সেই সমস্ত ব্যবহারকারীদের বাদ দিতে পারে যাদের ফোন বা ইমেলের অভাব থাকে। খুব কমই কোন উন্নতি। এছাড়াও, "ডানদিকে সমস্ত রেকর্ডে সমস্ত রেকর্ডগুলি ডানদিকে" ব্যাখ্যা করার সময় এই ONমানদণ্ডটি এড়িয়ে যায় , যা কার্তেসিয়ান পণ্যের অন্তর্নিহিত সমস্ত 'ভুল' সম্পর্ককে ছাঁটাই করে তবে সমস্ত পুনরাবৃত্তি ক্ষেত্রগুলিকে রাখে।
জাভিয়ের

@ জাভিয়ার: হ্যাঁ, এ কারণেই আমি এও বলেছি যে আপনার আসলে বাম যোগদানের দরকার আছে, না কোনও অভ্যন্তরীণ যোগদান যথেষ্ট হবে? * ওপি-র সমস্যার বিবরণ এটিকে * শব্দটি এমন করে তোলে যেন তারা অভ্যন্তরীণ যোগদানের ফলাফল আশা করে। অবশ্যই, কোনও নমুনা ডেটা বা তারা আসলে কী চেয়েছিল তার বিবরণ ছাড়াই বলা মুশকিল। আমি এই পরামর্শটি দিয়েছি কারণ আমি আসলে লোকদের (যাদের সাথে আমি কাজ করি) এটি করতে দেখেছি: ভুল যোগদান যোগদান করুন এবং তারপরে তারা যখন প্রাপ্ত ফলাফলগুলি বুঝতে না পারেন তখন অভিযোগ করুন। রয়ে দেখা এটা আমি ভেবেছিলাম এটা এখানে ঘটেছে থাকতে পারে।
হতাশ

3
আপনি প্রশ্নের বিন্দুটি মিস করছেন। এই প্রকল্পিত উদাহরণে, আমি চাই সমস্ত ব্যবহারকারী ডেটা (নাম, DOB, ইত্যাদি) এবং আমি সব তার / তার ফোন নম্বর চান। অভ্যন্তরীণ যোগদানের মাধ্যমে ব্যবহারকারীরা ডাব্লু / কোনও ইমেল বা কোনও ফোন বাদ দেয় না - এটি কীভাবে সহায়তা করে?
এমপেন

4

অনুসন্ধানগুলি সর্বদা ডেটাগুলির একটি আয়তক্ষেত্রাকার (আন-জ্যাগড) ট্যাবুলার সেট তৈরি করে। কোনও সেটের মধ্যে নেস্টেড সাব-সেট নেই। সেটের বিশ্বে সমস্ত কিছু খাঁটি অন-নেস্টেড আয়তক্ষেত্র।

পাশাপাশি আপনি পাশাপাশি 2 সেট স্থাপন হিসাবে আপনি একটি যোগদানের কথা ভাবতে পারেন। "অন" শর্তটি হ'ল প্রতিটি সেটে রেকর্ডগুলি কীভাবে মিলে যায়। যদি কোনও ব্যবহারকারীর 3 টি ফোন নম্বর থাকে তবে আপনি ব্যবহারকারীর তথ্যে 3-বারের নকল দেখতে পাবেন। একটি আয়তক্ষেত্রাকার আন-জ্যাগড সেট অবশ্যই ক্যোয়ারির দ্বারা উত্পন্ন করা উচিত। এটি কেবল 1-থেকে-বহু সম্পর্কের সাথে সেটগুলিতে যোগদানের প্রকৃতি।

আপনি যা চান তা পেতে, আপনাকে অবশ্যই আলাদা আলাদা ক্যোয়ারী ব্যবহার করতে হবে যেমন বর্ণিত ম্যাসন হুইলারের।

select * from Phones where user_id=344;

এই ক্যোয়ারির ফলাফলটি এখনও একটি আয়তক্ষেত্রের আন-জ্যাগড সেট। যেমনটি সেটের জগতের সবকিছু।


2

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

অন্যথায়, আপনি চান যে ডাটাবেসটি এই ডেটাসেটকে একসাথে রাখবে এবং তারপরে প্রতিটি সারিতে যোগ হওয়া ফলাফলের সমস্ত পুনরাবৃত্ত মানগুলি সরিয়ে ফেলবে এবং অগত্যা এই নয় যে সারিগুলিতে একই নাম বা ফোন নম্বরযুক্ত দু'জনের মতো ডুপ্লিকেট ডেটা থাকবে। ব্যান্ডউইথকে বাঁচাতে অনেকটাই ওভার-হেডের মতো মনে হচ্ছে। আপনি আরও ভাল ফিল্টারিং সহ কম ডেটা ফেরাতে এবং আপনার প্রয়োজনীয় কলামগুলি সরিয়ে ফোকাস করা ভাল। কারণ নির্বাচন * কখনই নির্ভর করে না এমন উত্পাদন-কূপে ব্যবহৃত হয়।


"কোনও কারণ নেই যে বেশিরভাগ ডাটাবেসগুলি একটি কলের মধ্যে 3 পৃথক ডেটাসেট ফেরত দিতে পারে না এবং এতে যোগ দেয় না" - আপনি কীভাবে এটি একটি কল দিয়ে 3 পৃথক ডেটাসেট ফেরত পেতে পারেন? আমি ভেবেছিলাম আপনাকে 3 টি আলাদা প্রশ্ন পাঠাতে হবে, যা প্রতিটিটির মধ্যে বিলম্বের পরিচয় দেয়?
এমপেন

একটি সঞ্চিত প্রক্রিয়াটি 1 টি লেনদেনে কল করা যেতে পারে এবং তারপরে আপনি যতটা ডেটাসেট চান তা ফিরিয়ে দিন। হতে পারে একটি "সিলেক্ট ইউজারউইথইমেলস ফোনস" স্প্রোকের প্রয়োজন।
গ্রাহাম

1
@ মার্ক: আপনি একই ব্যাচের অংশ হিসাবে একাধিক কমান্ড (কমপক্ষে স্কয়ার সার্ভারে) প্রেরণ করতে পারেন। সেমিডিটিেক্সট = "বি থেকে সিলেক্ট করুন; এ থেকে * সিলেক্ট করুন; সি থেকে * সিলেক্ট করুন" এবং তারপরে স্কেলকম্যান্ডের কমান্ড টেক্সট হিসাবে এটি ব্যবহার করুন।
jmoreno

2

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

একটি যোগদানের পরিবর্তে 2 টি পৃথক ক্যোয়ারী ইস্যু করুন।

সঞ্চিত পদ্ধতিতে বা ইনলাইন প্যারামিটারাইজড স্কয়ার ক্র্যাফট 2 টি কোয়েরিতে এবং উভয়ের ফলাফল ফিরিয়ে দেয়। বেশিরভাগ ডাটাবেস এবং ভাষা একাধিক ফলাফল সেট সমর্থন করে support

উদাহরণস্বরূপ, এসকিউএল সার্ভার এবং সি # এটি ব্যবহার করে কার্যকারিতা অর্জন করে IDataReader.NextResult()


1

আপনি কিছু মিস করছেন আপনি যদি নিজের ডেটাটিকে অস্বীকৃতি জানাতে চান তবে আপনাকে এটি নিজেই করতে হবে।

;with toList as (
    select  *, Stuff(( select ',' + (phone.phoneType + ':' + phone.PhoneNumber) 
                    from phones phone
                    where phone.user_id = user.user_id
                    for xml path('')
                  ), 1,1,'') as phoneNumbers
from users user
)
select *
from toList

1

রিলেশনাল ক্লোজারের ধারণা মূলত এর অর্থ যে কোনও জিজ্ঞাসার ফলাফল এমন একটি সম্পর্ক যা অন্য প্রশ্নের ক্ষেত্রে ব্যবহার করা যেতে পারে যেমন এটি একটি বেস টেবিল। এটি একটি শক্তিশালী ধারণা, কারণ এটি কোয়েরিগুলিকে কম্পনযোগ্য করে তোলে।

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

মূলত আপনি একটি সম্পর্কিত ডিবিএমএসের শীর্ষে একটি শ্রেণিবিন্যাসের ডিবিএমএস তৈরি করবেন। এটি একটি সন্দেহজনক সুবিধার জন্য আরও জটিল হবে এবং আপনি একটি ধারাবাহিকভাবে সম্পর্কিত সিস্টেমের সুবিধা হারাবেন।

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


-4

প্লসগুলি STUFF ফাংশনটির ব্যবহারকে বোঝায় যা একটি কলামের একাধিক সারি (ফোন নম্বর) (পরিচিতি) এর সাথে গোষ্ঠী করে যা একটি সারি (ব্যবহারকারী) এর সীমানাঙ্কিত মানগুলির একক ঘর হিসাবে বের করা যেতে পারে।

আজ আমরা এটি ব্যাপকভাবে ব্যবহার করছি তবে কিছু উচ্চ সিপিইউ এবং পারফরম্যান্স সমস্যার মুখোমুখি। এক্সএমএল ডেটা টাইপ হ'ল অন্য বিকল্প তবে এটি একটি নকশা পরিবর্তন যা ক্যোয়ারী স্তর এক নয়।


5
এটি কীভাবে প্রশ্নটির সমাধান করে তা প্রসারিত করুন। "Pls এর ব্যবহারের বিষয়ে উল্লেখ করুন" বলার পরিবর্তে এটি কীভাবে জিজ্ঞাসা করা প্রশ্নটি অর্জন করবে তার একটি উদাহরণ সরবরাহ করুন। এটি তৃতীয় পক্ষের উত্সগুলি উদ্ধৃত করার ক্ষেত্রেও সহায়ক হতে পারে যেখানে এটি জিনিসগুলি আরও স্পষ্ট করে তোলে।
বিটসোফ্লোগিক

1
দেখে মনে হচ্ছে STUFFবিভক্ত করার মতো। এটি কীভাবে আমার প্রশ্নের ক্ষেত্রে প্রযোজ্য তা নিশ্চিত নয়।
এমপেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.