2009-12-16 18 views
11

के बारे में कुछ प्रश्न SQL Server 2008 में मैं एक नौसिखिया हूं और अभी HierarchyId के साथ पेश किया गया है।HierarchyId (SQL Server 2008)

मैं SQL Server 2008 - HIERARCHYID - PART I से सीख रहा हूं। तो बुनियादी तौर पर मैं लाइन द्वारा लेख लाइन अनुसरण कर रही हूं और जब तक SSMS में अभ्यास मैंने पाया कि हर ChildId के लिए कुछ हेक्साडेसिमल मान 0x, 0x58,0x5AC0 आदि जैसे उत्पन्न कर रहे हैं

मेरे सवालों का

  1. क्या इन कर रहे हैं हेक्साडेसिमल मान?
  2. ये जेनरेट क्यों हैं और उनका उपयोग क्या है? मेरा मतलब है कि मैं उन हेक्सा मूल्यों का उपयोग कहां कर सकता हूं?
  3. क्या हमारे पास उन हेक्सा मूल्यों पर कोई नियंत्रण है? मेरा मतलब है कि हम अपडेट कर सकते हैं आदि
  4. उन हेक्सा मूल्यों को देखकर पदानुक्रम कैसे निर्धारित करें .. मेरा मतलब है कि मैं कैसे निर्धारित कर सकता हूं कि माता-पिता कौन सा है और कौन सा बच्चा है?

उत्तर

-3

मैं दूसरों को आपके विशिष्ट प्रश्नों को संबोधित करने दूंगा, लेकिन मैं आपको बता दूंगा कि, आईएमओ, SQL Server 2008 में HierarchyId SQL सर्वर में माइक्रोसॉफ्ट के सबसे बड़े योगदान में से एक नहीं है। वे जटिल और कुछ हद तक अजीब हैं। मुझे लगता है कि आप पाएंगे कि कई पदानुक्रमिक जरूरतों के लिए, आम टेबल एक्सप्रेशन (सीटीई) बहुत अच्छा काम करता है।

रैंडी

+6

मैं तुम्हें पुनरावर्ती सीटीई संदर्भ दे रहे मान, सामान्य रूप में सीटीई के रूप में पदानुक्रम के साथ कुछ नहीं किया है। फिर भी, ये दो अवधारणा पारस्परिक रूप से अनन्य नहीं हैं और पदानुक्रमित किसी भी अन्य विधि की तुलना में कहीं अधिक बेहतर प्रदर्शन है (जब अनुक्रमित और सही ढंग से उपयोग किया जाता है)। सूचकांक-खोज प्रदर्शन के साथ बहुत जटिल पदानुक्रमित प्रश्नों को करने के लिए एक श्रेणीबद्ध कॉलम को अन्य नेस्टेड-सेट प्रकार कॉलम के साथ भी जोड़ा जा सकता है। मैं कहूंगा कि आपकी आलोचना निराधार है; पदानुक्रम वास्तव में SQL 2008 में सबसे कम उपयोग किए जाने वाले डेटा प्रकारों में से एक है। – Aaronaught

+2

यह केवल अंतर्निहित नहीं है, यह भी समर्थित है। LinqtoSQL या Entity Framework में HierarchyId के लिए कोई समर्थन नहीं है (डीबीएमएल डिजाइनर बस उन्हें छूएगा नहीं)। यह भी वीएस 2010 आरसी में सच है। –

+2

हम में से कुछ के लिए, HierarchyId SQL के लिए एक बहुत आवश्यक अतिरिक्त है। यह कई पुनरावर्ती प्रश्नों की आवश्यकता को समाप्त करता है, और सही ढंग से उपयोग किए जाने पर महत्वपूर्ण प्रदर्शन लाभ प्रदान कर सकता है। – Mark

11

उन हेक्स मान बस पदानुक्रम स्तर के एक द्विआधारी प्रतिनिधित्व कर रहे हैं। आम तौर पर, आपको सीधे उनका उपयोग नहीं करना चाहिए।

आप निम्न उदाहरण देखना चाहते हैं, जो मुझे लगता है कि स्वयं स्पष्टीकरण होना चाहिए। मुझे आशा है कि यह आपको सही दिशा में जायेगा।

एक hierarchyid क्षेत्र के साथ एक मेज बनाएँ:

INSERT INTO groups (group_name, group_hierarchy) 
VALUES 
    ('root',  hierarchyid::Parse('/')), 
    ('domain-a', hierarchyid::Parse('/1/')), 
    ('domain-b', hierarchyid::Parse('/2/')), 
    ('sub-a-1', hierarchyid::Parse('/1/1/')), 
    ('sub-a-2', hierarchyid::Parse('/1/2/')); 

क्वेरी तालिका:

CREATE TABLE groups (
    group_name  nvarchar(100) NOT NULL, 
    group_hierarchy hierarchyid NOT NULL 
); 

कुछ मान डालें

SELECT 
    group_name, 
    group_hierarchy.ToString() 
FROM 
    groups 
WHERE 
    (group_hierarchy.IsDescendantOf(hierarchyid::Parse('/1/')) = 1); 
0

एडम Milazzo के धर्मशाला यहाँ hierarchyid के बारे में बहुत लेख लिखा था:

http://www.adammil.net/blog/view.php?id=100

संक्षेप में, यह सीधे हेक्स में चीजों के साथ काम करने के लिए, बल्कि द्विआधारी के लिए बाहर संख्या बदलती है सार्थक नहीं है। कारण यह है कि चीजें बाइट सीमाओं पर भी कट नहीं होती हैं। एक एकल नोड का प्रतिनिधित्व करना 5 बिट्स जितना छोटा हो सकता है यदि यह पहले चार नोड्स में से एक है। अधिक लंबे समय तक बनता है क्योंकि अधिक नोड्स का उपयोग किया जाता है, अगले 4 नोड्स के लिए 6 बिट प्रत्येक, अगले 8 नोड्स के लिए प्रत्येक 7 बिट्स, और फिर यह अगले 64 नोड्स के लिए प्रत्येक 12 बिट्स तक कूदता है! और फिर अगले 1024 के लिए प्रत्येक 18 बिट्स तक।

मुझे डेटाबेस को पोस्टग्रेज़ में कनवर्ट करने की आवश्यकता है, और एक स्क्रिप्ट लिखी है जो इन हेक्स मानों को पार करती है।आप एक संस्करण मैं यहाँ AdventureWorks के लिए बनाया बाहर की जाँच कर सकते हैं "hierarchyid" के लिए खोज:

https://github.com/lorint/AdventureWorks-for-Postgres/blob/master/install.sql

संबंधित मुद्दे