home.social

#data-model — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #data-model, aggregated by home.social.

fetched live
  1. “Status” columns in Oracle

    I wrote this blog post a while ago, and I’ve just spotted it in the backlog drafts, so I though it might be time to publish it. This may be old news to many of you, but I sometimes work on systems where consideration for how to store STATUS columns (or more accurately, columns with low cardinality / few values) at the design stage would have saved an awful lot of problems.

    In the scenario where you are recording the status of an action within an Oracle table, there are many ways to accomplish it. However, some ways are better than others.

    Let us say that we have 2 statuses; “NOT YET PROCESSED” and “COMPLETE”.

    Let us also assume a 1,000,000,000 rows table for sizing purposes, with 1,000 rows “NOT YET PROCESSED” and all of the rest set to “COMPLETE”.

    We could store and index these in several different ways:

    Storing a descriptive status

     CREATE TABLE STATUS_TAB  (prim_key NUMBER,   otherdata VARCHAR2, etc...   STATUS VARCHAR2(20) NOT NULL ); 

    We could store the values as they are represented above. Very descriptive, but it will waste a lot of space.
    Storing the word “COMPLETE” one billion times will take about 7.5 GB.

    There’s also no guarantee that you will have good data integrity – the data is not being validated against a STATUS_DESCRIPTION, so we should also have CHECK constraint to ensure only the values we want to have in the table are there.

    Using a number to represent the staus

     CREATE TABLE STATUS_TAB   (prim_key number,   otherdata VARCHAR2, etc...   STATUS number NOT NULL); 

    In this scenario, a 0 would represent “NOT YET PROCESSED” and a 1 would represent “COMPLETE”. Much better, but changing status from 0 to 1 will increase the size of your row by 1 byte.

    “0” takes 1 byte to store in Oracle.
    “1” takes 2 bytes to store.

    You could cause some possible row migrations, and increase your storage requirement from 1GB to 2 GB for this column.

    We would need a small second table STATUS_DESCRIPTION with a foreign key relationship, to explain the status and keep everything nice and relational with good data integrity.

    Using a single character for the status

     CREATE TABLE STATUS_TAB   (prim_key number,   otherdata VARCHAR2, etc...   STATUS varchar2(1) NOT NULL); 

    Now, an “N” would represent “NOT YET PROCESSED” and a “C” would represent “COMPLETE”. Even better, now it’s just 1 byte to store your character, regardless of status. You still need 1 GB to store this data though.

    We would need a small second table STATUS_DESCRIPTION as before.

    Histograms: assuming you wish to query via the status, we need to allow Oracle to create a frequency Histogram on the indexed column in all scenario’s above, the optimizer would understand that there are very few values for the “not yet processed” status and many for “complete”, meaning that the index could be used when querying for the rare values. Without the histogram, the index is unlikely to be used for any value as Oracle would assume a 50/50 split between the 2 values and 500,000,000 single block lookups from the index isn’t going to be a selected access path.

    Using NULL to represent COMPLETE

     CREATE TABLE STATUS_TAB   (prim_key number,    otherdata VARCHAR2, etc...   STATUS varchar2(1) ) ; 

    Now, an “O” would represent “NOT YET PROCESSED” and “NULL” would represent “COMPLETE”. Now it’s just 1 byte to store your character before you process the data and NO bytes to store it when you are complete, assuming there are no columns in the table following the STATUs column. Oracle does not store NULLs at the end of a table if they are not there.

    Better still, because NULL’s are not stored within B-Tree indexes within Oracle, and I suspect the query “show me what I need to process” is a lot more common than “show me what I have processed”, putting an index on a 1,000,000,000 row table with 1,000 unprocessed rows will result in an index containing 1000 bytes (plus 10 byte rowid per entry, plus block overhead).

    That’s not a very big index – a couple of blocks for a potentially huge table and would be extremely quick to read. When querying for a value which is not NULL, the index would be very useful.

    We would need a small second table STATUS_DESCRIPTION as before.

    Using BOOLEAN type

     CREATE TABLE STATUS_TAB   (prim_key number,    otherdata VARCHAR2, etc...   STATUS BOOLEAN ) ; 

    If you ony have 2 status levels, and will definitely not have more than 2, you could use the BOOLEAN type to store the status. This gives a TRUE or FALSE option but, and this is important in this context, a BOOLEAN takles 1 bytes to store and still has a length byte so it’s no more efficient from a storage perspective, and somewhat less flexible.

    Caveat: All sizes are very approximate and don’t account for block overhead, length byte per column and – in an index – the storage of the ROWID, which takes 10 bytes per entry.

    #ai #data #dataModel #database #design #flag #lowCardinality #model #null #oracle #sql #status #technology
  2. “Status” columns in Oracle

    I wrote this blog post a while ago, and I’ve just spotted it in the backlog drafts, so I though it might be time to publish it. This may be old news to many of you, but I sometimes work on systems where consideration for how to store STATUS columns (or more accurately, columns with low cardinality / few values) at the design stage would have saved an awful lot of problems.

    In the scenario where you are recording the status of an action within an Oracle table, there are many ways to accomplish it. However, some ways are better than others.

    Let us say that we have 2 statuses; “NOT YET PROCESSED” and “COMPLETE”.

    Let us also assume a 1,000,000,000 rows table for sizing purposes, with 1,000 rows “NOT YET PROCESSED” and all of the rest set to “COMPLETE”.

    We could store and index these in several different ways:

    Storing a descriptive status

     CREATE TABLE STATUS_TAB  (prim_key NUMBER,   otherdata VARCHAR2, etc...   STATUS VARCHAR2(20) NOT NULL ); 

    We could store the values as they are represented above. Very descriptive, but it will waste a lot of space.
    Storing the word “COMPLETE” one billion times will take about 7.5 GB.

    There’s also no guarantee that you will have good data integrity – the data is not being validated against a STATUS_DESCRIPTION, so we should also have CHECK constraint to ensure only the values we want to have in the table are there.

    Using a number to represent the staus

     CREATE TABLE STATUS_TAB   (prim_key number,   otherdata VARCHAR2, etc...   STATUS number NOT NULL); 

    In this scenario, a 0 would represent “NOT YET PROCESSED” and a 1 would represent “COMPLETE”. Much better, but changing status from 0 to 1 will increase the size of your row by 1 byte.

    “0” takes 1 byte to store in Oracle.
    “1” takes 2 bytes to store.

    You could cause some possible row migrations, and increase your storage requirement from 1GB to 2 GB for this column.

    We would need a small second table STATUS_DESCRIPTION with a foreign key relationship, to explain the status and keep everything nice and relational with good data integrity.

    Using a single character for the status

     CREATE TABLE STATUS_TAB   (prim_key number,   otherdata VARCHAR2, etc...   STATUS varchar2(1) NOT NULL); 

    Now, an “N” would represent “NOT YET PROCESSED” and a “C” would represent “COMPLETE”. Even better, now it’s just 1 byte to store your character, regardless of status. You still need 1 GB to store this data though.

    We would need a small second table STATUS_DESCRIPTION as before.

    Histograms: assuming you wish to query via the status, we need to allow Oracle to create a frequency Histogram on the indexed column in all scenario’s above, the optimizer would understand that there are very few values for the “not yet processed” status and many for “complete”, meaning that the index could be used when querying for the rare values. Without the histogram, the index is unlikely to be used for any value as Oracle would assume a 50/50 split between the 2 values and 500,000,000 single block lookups from the index isn’t going to be a selected access path.

    Using NULL to represent COMPLETE

     CREATE TABLE STATUS_TAB   (prim_key number,    otherdata VARCHAR2, etc...   STATUS varchar2(1) ) ; 

    Now, an “O” would represent “NOT YET PROCESSED” and “NULL” would represent “COMPLETE”. Now it’s just 1 byte to store your character before you process the data and NO bytes to store it when you are complete, assuming there are no columns in the table following the STATUs column. Oracle does not store NULLs at the end of a table if they are not there.

    Better still, because NULL’s are not stored within B-Tree indexes within Oracle, and I suspect the query “show me what I need to process” is a lot more common than “show me what I have processed”, putting an index on a 1,000,000,000 row table with 1,000 unprocessed rows will result in an index containing 1000 bytes (plus 10 byte rowid per entry, plus block overhead).

    That’s not a very big index – a couple of blocks for a potentially huge table and would be extremely quick to read. When querying for a value which is not NULL, the index would be very useful.

    We would need a small second table STATUS_DESCRIPTION as before.

    Using BOOLEAN type

     CREATE TABLE STATUS_TAB   (prim_key number,    otherdata VARCHAR2, etc...   STATUS BOOLEAN ) ; 

    If you ony have 2 status levels, and will definitely not have more than 2, you could use the BOOLEAN type to store the status. This gives a TRUE or FALSE option but, and this is important in this context, a BOOLEAN takles 1 bytes to store and still has a length byte so it’s no more efficient from a storage perspective, and somewhat less flexible.

    Caveat: All sizes are very approximate and don’t account for block overhead, length byte per column and – in an index – the storage of the ROWID, which takes 10 bytes per entry.

    #ai #data #dataModel #database #design #flag #lowCardinality #model #null #oracle #sql #status #technology
  3. “Status” columns in Oracle

    I wrote this blog post a while ago, and I’ve just spotted it in the backlog drafts, so I though it might be time to publish it. This may be old news to many of you, but I sometimes work on systems where consideration for how to store STATUS columns (or more accurately, columns with low cardinality / few values) at the design stage would have saved an awful lot of problems.

    In the scenario where you are recording the status of an action within an Oracle table, there are many ways to accomplish it. However, some ways are better than others.

    Let us say that we have 2 statuses; “NOT YET PROCESSED” and “COMPLETE”.

    Let us also assume a 1,000,000,000 rows table for sizing purposes, with 1,000 rows “NOT YET PROCESSED” and all of the rest set to “COMPLETE”.

    We could store and index these in several different ways:

    Storing a descriptive status

     CREATE TABLE STATUS_TAB  (prim_key NUMBER,   otherdata VARCHAR2, etc...   STATUS VARCHAR2(20) NOT NULL ); 

    We could store the values as they are represented above. Very descriptive, but it will waste a lot of space.
    Storing the word “COMPLETE” one billion times will take about 7.5 GB.

    There’s also no guarantee that you will have good data integrity – the data is not being validated against a STATUS_DESCRIPTION, so we should also have CHECK constraint to ensure only the values we want to have in the table are there.

    Using a number to represent the staus

     CREATE TABLE STATUS_TAB   (prim_key number,   otherdata VARCHAR2, etc...   STATUS number NOT NULL); 

    In this scenario, a 0 would represent “NOT YET PROCESSED” and a 1 would represent “COMPLETE”. Much better, but changing status from 0 to 1 will increase the size of your row by 1 byte.

    “0” takes 1 byte to store in Oracle.
    “1” takes 2 bytes to store.

    You could cause some possible row migrations, and increase your storage requirement from 1GB to 2 GB for this column.

    We would need a small second table STATUS_DESCRIPTION with a foreign key relationship, to explain the status and keep everything nice and relational with good data integrity.

    Using a single character for the status

     CREATE TABLE STATUS_TAB   (prim_key number,   otherdata VARCHAR2, etc...   STATUS varchar2(1) NOT NULL); 

    Now, an “N” would represent “NOT YET PROCESSED” and a “C” would represent “COMPLETE”. Even better, now it’s just 1 byte to store your character, regardless of status. You still need 1 GB to store this data though.

    We would need a small second table STATUS_DESCRIPTION as before.

    Histograms: assuming you wish to query via the status, we need to allow Oracle to create a frequency Histogram on the indexed column in all scenario’s above, the optimizer would understand that there are very few values for the “not yet processed” status and many for “complete”, meaning that the index could be used when querying for the rare values. Without the histogram, the index is unlikely to be used for any value as Oracle would assume a 50/50 split between the 2 values and 500,000,000 single block lookups from the index isn’t going to be a selected access path.

    Using NULL to represent COMPLETE

     CREATE TABLE STATUS_TAB   (prim_key number,    otherdata VARCHAR2, etc...   STATUS varchar2(1) ) ; 

    Now, an “O” would represent “NOT YET PROCESSED” and “NULL” would represent “COMPLETE”. Now it’s just 1 byte to store your character before you process the data and NO bytes to store it when you are complete, assuming there are no columns in the table following the STATUs column. Oracle does not store NULLs at the end of a table if they are not there.

    Better still, because NULL’s are not stored within B-Tree indexes within Oracle, and I suspect the query “show me what I need to process” is a lot more common than “show me what I have processed”, putting an index on a 1,000,000,000 row table with 1,000 unprocessed rows will result in an index containing 1000 bytes (plus 10 byte rowid per entry, plus block overhead).

    That’s not a very big index – a couple of blocks for a potentially huge table and would be extremely quick to read. When querying for a value which is not NULL, the index would be very useful.

    We would need a small second table STATUS_DESCRIPTION as before.

    Using BOOLEAN type

     CREATE TABLE STATUS_TAB   (prim_key number,    otherdata VARCHAR2, etc...   STATUS BOOLEAN ) ; 

    If you ony have 2 status levels, and will definitely not have more than 2, you could use the BOOLEAN type to store the status. This gives a TRUE or FALSE option but, and this is important in this context, a BOOLEAN takles 1 bytes to store and still has a length byte so it’s no more efficient from a storage perspective, and somewhat less flexible.

    Caveat: All sizes are very approximate and don’t account for block overhead, length byte per column and – in an index – the storage of the ROWID, which takes 10 bytes per entry.

    #ai #data #dataModel #database #design #flag #lowCardinality #model #null #oracle #sql #status #technology
  4. “Status” columns in Oracle

    I wrote this blog post a while ago, and I’ve just spotted it in the backlog drafts, so I though it might be time to publish it. This may be old news to many of you, but I sometimes work on systems where consideration for how to store STATUS columns (or more accurately, columns with low cardinality / few values) at the design stage would have saved an awful lot of problems.

    In the scenario where you are recording the status of an action within an Oracle table, there are many ways to accomplish it. However, some ways are better than others.

    Let us say that we have 2 statuses; “NOT YET PROCESSED” and “COMPLETE”.

    Let us also assume a 1,000,000,000 rows table for sizing purposes, with 1,000 rows “NOT YET PROCESSED” and all of the rest set to “COMPLETE”.

    We could store and index these in several different ways:

    Storing a descriptive status

     CREATE TABLE STATUS_TAB  (prim_key NUMBER,   otherdata VARCHAR2, etc...   STATUS VARCHAR2(20) NOT NULL ); 

    We could store the values as they are represented above. Very descriptive, but it will waste a lot of space.
    Storing the word “COMPLETE” one billion times will take about 7.5 GB.

    There’s also no guarantee that you will have good data integrity – the data is not being validated against a STATUS_DESCRIPTION, so we should also have CHECK constraint to ensure only the values we want to have in the table are there.

    Using a number to represent the staus

     CREATE TABLE STATUS_TAB   (prim_key number,   otherdata VARCHAR2, etc...   STATUS number NOT NULL); 

    In this scenario, a 0 would represent “NOT YET PROCESSED” and a 1 would represent “COMPLETE”. Much better, but changing status from 0 to 1 will increase the size of your row by 1 byte.

    “0” takes 1 byte to store in Oracle.
    “1” takes 2 bytes to store.

    You could cause some possible row migrations, and increase your storage requirement from 1GB to 2 GB for this column.

    We would need a small second table STATUS_DESCRIPTION with a foreign key relationship, to explain the status and keep everything nice and relational with good data integrity.

    Using a single character for the status

     CREATE TABLE STATUS_TAB   (prim_key number,   otherdata VARCHAR2, etc...   STATUS varchar2(1) NOT NULL); 

    Now, an “N” would represent “NOT YET PROCESSED” and a “C” would represent “COMPLETE”. Even better, now it’s just 1 byte to store your character, regardless of status. You still need 1 GB to store this data though.

    We would need a small second table STATUS_DESCRIPTION as before.

    Histograms: assuming you wish to query via the status, we need to allow Oracle to create a frequency Histogram on the indexed column in all scenario’s above, the optimizer would understand that there are very few values for the “not yet processed” status and many for “complete”, meaning that the index could be used when querying for the rare values. Without the histogram, the index is unlikely to be used for any value as Oracle would assume a 50/50 split between the 2 values and 500,000,000 single block lookups from the index isn’t going to be a selected access path.

    Using NULL to represent COMPLETE

     CREATE TABLE STATUS_TAB   (prim_key number,    otherdata VARCHAR2, etc...   STATUS varchar2(1) ) ; 

    Now, an “O” would represent “NOT YET PROCESSED” and “NULL” would represent “COMPLETE”. Now it’s just 1 byte to store your character before you process the data and NO bytes to store it when you are complete, assuming there are no columns in the table following the STATUs column. Oracle does not store NULLs at the end of a table if they are not there.

    Better still, because NULL’s are not stored within B-Tree indexes within Oracle, and I suspect the query “show me what I need to process” is a lot more common than “show me what I have processed”, putting an index on a 1,000,000,000 row table with 1,000 unprocessed rows will result in an index containing 1000 bytes (plus 10 byte rowid per entry, plus block overhead).

    That’s not a very big index – a couple of blocks for a potentially huge table and would be extremely quick to read. When querying for a value which is not NULL, the index would be very useful.

    We would need a small second table STATUS_DESCRIPTION as before.

    Using BOOLEAN type

     CREATE TABLE STATUS_TAB   (prim_key number,    otherdata VARCHAR2, etc...   STATUS BOOLEAN ) ; 

    If you ony have 2 status levels, and will definitely not have more than 2, you could use the BOOLEAN type to store the status. This gives a TRUE or FALSE option but, and this is important in this context, a BOOLEAN takles 1 bytes to store and still has a length byte so it’s no more efficient from a storage perspective, and somewhat less flexible.

    Caveat: All sizes are very approximate and don’t account for block overhead, length byte per column and – in an index – the storage of the ROWID, which takes 10 bytes per entry.

    #ai #data #dataModel #database #design #flag #lowCardinality #model #null #oracle #sql #status #technology
  5. “Status” columns in Oracle

    I wrote this blog post a while ago, and I’ve just spotted it in the backlog drafts, so I though it might be time to publish it. This may be old news to many of you, but I sometimes work on systems where consideration for how to store STATUS columns (or more accurately, columns with low cardinality / few values) at the design stage would have saved an awful lot of problems.

    In the scenario where you are recording the status of an action within an Oracle table, there are many ways to accomplish it. However, some ways are better than others.

    Let us say that we have 2 statuses; “NOT YET PROCESSED” and “COMPLETE”.

    Let us also assume a 1,000,000,000 rows table for sizing purposes, with 1,000 rows “NOT YET PROCESSED” and all of the rest set to “COMPLETE”.

    We could store and index these in several different ways:

    Storing a descriptive status

     CREATE TABLE STATUS_TAB  (prim_key NUMBER,   otherdata VARCHAR2, etc...   STATUS VARCHAR2(20) NOT NULL ); 

    We could store the values as they are represented above. Very descriptive, but it will waste a lot of space.
    Storing the word “COMPLETE” one billion times will take about 7.5 GB.

    There’s also no guarantee that you will have good data integrity – the data is not being validated against a STATUS_DESCRIPTION, so we should also have CHECK constraint to ensure only the values we want to have in the table are there.

    Using a number to represent the staus

     CREATE TABLE STATUS_TAB   (prim_key number,   otherdata VARCHAR2, etc...   STATUS number NOT NULL); 

    In this scenario, a 0 would represent “NOT YET PROCESSED” and a 1 would represent “COMPLETE”. Much better, but changing status from 0 to 1 will increase the size of your row by 1 byte.

    “0” takes 1 byte to store in Oracle.
    “1” takes 2 bytes to store.

    You could cause some possible row migrations, and increase your storage requirement from 1GB to 2 GB for this column.

    We would need a small second table STATUS_DESCRIPTION with a foreign key relationship, to explain the status and keep everything nice and relational with good data integrity.

    Using a single character for the status

     CREATE TABLE STATUS_TAB   (prim_key number,   otherdata VARCHAR2, etc...   STATUS varchar2(1) NOT NULL); 

    Now, an “N” would represent “NOT YET PROCESSED” and a “C” would represent “COMPLETE”. Even better, now it’s just 1 byte to store your character, regardless of status. You still need 1 GB to store this data though.

    We would need a small second table STATUS_DESCRIPTION as before.

    Histograms: assuming you wish to query via the status, we need to allow Oracle to create a frequency Histogram on the indexed column in all scenario’s above, the optimizer would understand that there are very few values for the “not yet processed” status and many for “complete”, meaning that the index could be used when querying for the rare values. Without the histogram, the index is unlikely to be used for any value as Oracle would assume a 50/50 split between the 2 values and 500,000,000 single block lookups from the index isn’t going to be a selected access path.

    Using NULL to represent COMPLETE

     CREATE TABLE STATUS_TAB   (prim_key number,    otherdata VARCHAR2, etc...   STATUS varchar2(1) ) ; 

    Now, an “O” would represent “NOT YET PROCESSED” and “NULL” would represent “COMPLETE”. Now it’s just 1 byte to store your character before you process the data and NO bytes to store it when you are complete, assuming there are no columns in the table following the STATUs column. Oracle does not store NULLs at the end of a table if they are not there.

    Better still, because NULL’s are not stored within B-Tree indexes within Oracle, and I suspect the query “show me what I need to process” is a lot more common than “show me what I have processed”, putting an index on a 1,000,000,000 row table with 1,000 unprocessed rows will result in an index containing 1000 bytes (plus 10 byte rowid per entry, plus block overhead).

    That’s not a very big index – a couple of blocks for a potentially huge table and would be extremely quick to read. When querying for a value which is not NULL, the index would be very useful.

    We would need a small second table STATUS_DESCRIPTION as before.

    Using BOOLEAN type

     CREATE TABLE STATUS_TAB   (prim_key number,    otherdata VARCHAR2, etc...   STATUS BOOLEAN ) ; 

    If you ony have 2 status levels, and will definitely not have more than 2, you could use the BOOLEAN type to store the status. This gives a TRUE or FALSE option but, and this is important in this context, a BOOLEAN takles 1 bytes to store and still has a length byte so it’s no more efficient from a storage perspective, and somewhat less flexible.

    Caveat: All sizes are very approximate and don’t account for block overhead, length byte per column and – in an index – the storage of the ROWID, which takes 10 bytes per entry.

    #ai #data #dataModel #database #design #flag #lowCardinality #model #null #oracle #sql #status #technology
  6. #rdf #linkeddata #LOD #datamodel
    {3/n} But I really want something in the specs that states this requirement in a more hard and fast way and I'm not finding it. For example, RDF 1.1 Concepts and Abstract Syntax > 3.1 Triples doesn't come out and provide any req's for the predicate other than that it is an IRI.
    I thought that perhaps The RDF Concepts Vocabulary (RDF namespace) properties for reifying triples might help, but -- to my surprise -- rdf:predicate has rdfs:range rdfs:Resource -- I expected this to be rdf:Property.
    Thus, I'm not currently coming up with anything from the specs (thus, looking for wisdom -- entirely possible and in fact dependable that I am missing things), but rather, only what seems like convention.

  7. #rdf #linkeddata #LOD #datamodel
    {3/n} But I really want something in the specs that states this requirement in a more hard and fast way and I'm not finding it. For example, RDF 1.1 Concepts and Abstract Syntax > 3.1 Triples doesn't come out and provide any req's for the predicate other than that it is an IRI.
    I thought that perhaps The RDF Concepts Vocabulary (RDF namespace) properties for reifying triples might help, but -- to my surprise -- rdf:predicate has rdfs:range rdfs:Resource -- I expected this to be rdf:Property.
    Thus, I'm not currently coming up with anything from the specs (thus, looking for wisdom -- entirely possible and in fact dependable that I am missing things), but rather, only what seems like convention.

  8. #rdf #linkeddata #LOD #datamodel
    {3/n} But I really want something in the specs that states this requirement in a more hard and fast way and I'm not finding it. For example, RDF 1.1 Concepts and Abstract Syntax > 3.1 Triples doesn't come out and provide any req's for the predicate other than that it is an IRI.
    I thought that perhaps The RDF Concepts Vocabulary (RDF namespace) properties for reifying triples might help, but -- to my surprise -- rdf:predicate has rdfs:range rdfs:Resource -- I expected this to be rdf:Property.
    Thus, I'm not currently coming up with anything from the specs (thus, looking for wisdom -- entirely possible and in fact dependable that I am missing things), but rather, only what seems like convention.


  9. {3/n} But I really want something in the specs that states this requirement in a more hard and fast way and I'm not finding it. For example, RDF 1.1 Concepts and Abstract Syntax > 3.1 Triples doesn't come out and provide any req's for the predicate other than that it is an IRI.
    I thought that perhaps The RDF Concepts Vocabulary (RDF namespace) properties for reifying triples might help, but -- to my surprise -- rdf:predicate has rdfs:range rdfs:Resource -- I expected this to be rdf:Property.
    Thus, I'm not currently coming up with anything from the specs (thus, looking for wisdom -- entirely possible and in fact dependable that I am missing things), but rather, only what seems like convention.

  10. #rdf #linkeddata #LOD #datamodel
    {3/n} But I really want something in the specs that states this requirement in a more hard and fast way and I'm not finding it. For example, RDF 1.1 Concepts and Abstract Syntax > 3.1 Triples doesn't come out and provide any req's for the predicate other than that it is an IRI.
    I thought that perhaps The RDF Concepts Vocabulary (RDF namespace) properties for reifying triples might help, but -- to my surprise -- rdf:predicate has rdfs:range rdfs:Resource -- I expected this to be rdf:Property.
    Thus, I'm not currently coming up with anything from the specs (thus, looking for wisdom -- entirely possible and in fact dependable that I am missing things), but rather, only what seems like convention.

  11. #rdf #linkeddata #LOD #datamodel
    {2/n} I mean, I might explain this in a very non-technical way, like,
    When you publish an RDF metadata description set you are creating a model with the triples. You are asserting that the subject of each triple has the attribute value of or relationship with the object.
    If the predicate of the triple isn't something modelled in a way that makes this connection, it won't work well for various reasons (users likely won't query using predicates that aren't instances of rdf:Property or some subclass of that, would be the most important I think.)

  12. #rdf #linkeddata #LOD #datamodel
    {2/n} I mean, I might explain this in a very non-technical way, like,
    When you publish an RDF metadata description set you are creating a model with the triples. You are asserting that the subject of each triple has the attribute value of or relationship with the object.
    If the predicate of the triple isn't something modelled in a way that makes this connection, it won't work well for various reasons (users likely won't query using predicates that aren't instances of rdf:Property or some subclass of that, would be the most important I think.)


  13. {2/n} I mean, I might explain this in a very non-technical way, like,
    When you publish an RDF metadata description set you are creating a model with the triples. You are asserting that the subject of each triple has the attribute value of or relationship with the object.
    If the predicate of the triple isn't something modelled in a way that makes this connection, it won't work well for various reasons (users likely won't query using predicates that aren't instances of rdf:Property or some subclass of that, would be the most important I think.)

  14. #rdf #linkeddata #LOD #datamodel

    { 1/n } Reviewing an RDF metadata application profile, came across an IRI used as a predicate in metadata description set triples, looked at modelling from the source:

    ```Turtle
    <ebu.ch/metadata/ontologies/ebu> a rdfs:Class ;
    rdfs:label "Content alert"@en ;
    rdfs:comment "To provide information about a particular type of content potentially sensitive."@en ;
    rdfs:subClassOf <ebu.ch/metadata/ontologies/ebu> .
    ```

    Said something like "Oh, well, that's a class, we can't use that as a property, we'll want to change that."
    Was asked the question "Why can't we use that IRI as a property?"
    The fact that you can't use a resource that is an instance of rdfs:Class as a predicate in an RDF triple -- or, at least, you shouldn't -- seemed self-evident to me. But I found I was somewhat at a loss to come up with what I consider a solid response about why this is the case based in RDF specs.
    Thus, here I am looking for wisdom on the internet.
    To say a bit more...

  15. #rdf #linkeddata #LOD #datamodel

    { 1/n } Reviewing an RDF metadata application profile, came across an IRI used as a predicate in metadata description set triples, looked at modelling from the source:

    ```Turtle
    <ebu.ch/metadata/ontologies/ebu> a rdfs:Class ;
    rdfs:label "Content alert"@en ;
    rdfs:comment "To provide information about a particular type of content potentially sensitive."@en ;
    rdfs:subClassOf <ebu.ch/metadata/ontologies/ebu> .
    ```

    Said something like "Oh, well, that's a class, we can't use that as a property, we'll want to change that."
    Was asked the question "Why can't we use that IRI as a property?"
    The fact that you can't use a resource that is an instance of rdfs:Class as a predicate in an RDF triple -- or, at least, you shouldn't -- seemed self-evident to me. But I found I was somewhat at a loss to come up with what I consider a solid response about why this is the case based in RDF specs.
    Thus, here I am looking for wisdom on the internet.
    To say a bit more...

  16. #rdf #linkeddata #LOD #datamodel

    { 1/n } Reviewing an RDF metadata application profile, came across an IRI used as a predicate in metadata description set triples, looked at modelling from the source:

    ```Turtle
    <ebu.ch/metadata/ontologies/ebu> a rdfs:Class ;
    rdfs:label "Content alert"@en ;
    rdfs:comment "To provide information about a particular type of content potentially sensitive."@en ;
    rdfs:subClassOf <ebu.ch/metadata/ontologies/ebu> .
    ```

    Said something like "Oh, well, that's a class, we can't use that as a property, we'll want to change that."
    Was asked the question "Why can't we use that IRI as a property?"
    The fact that you can't use a resource that is an instance of rdfs:Class as a predicate in an RDF triple -- or, at least, you shouldn't -- seemed self-evident to me. But I found I was somewhat at a loss to come up with what I consider a solid response about why this is the case based in RDF specs.
    Thus, here I am looking for wisdom on the internet.
    To say a bit more...

  17. { 1/n } Reviewing an RDF metadata application profile, came across an IRI used as a predicate in metadata description set triples, looked at modelling from the source:

    ```Turtle
    <ebu.ch/metadata/ontologies/ebu> a rdfs:Class ;
    rdfs:label "Content alert"@en ;
    rdfs:comment "To provide information about a particular type of content potentially sensitive."@en ;
    rdfs:subClassOf <ebu.ch/metadata/ontologies/ebu> .
    ```

    Said something like "Oh, well, that's a class, we can't use that as a property, we'll want to change that."
    Was asked the question "Why can't we use that IRI as a property?"
    The fact that you can't use a resource that is an instance of rdfs:Class as a predicate in an RDF triple -- or, at least, you shouldn't -- seemed self-evident to me. But I found I was somewhat at a loss to come up with what I consider a solid response about why this is the case based in RDF specs.
    Thus, here I am looking for wisdom on the internet.
    To say a bit more...

  18. #rdf #linkeddata #LOD #datamodel

    { 1/n } Reviewing an RDF metadata application profile, came across an IRI used as a predicate in metadata description set triples, looked at modelling from the source:

    ```Turtle
    <ebu.ch/metadata/ontologies/ebu> a rdfs:Class ;
    rdfs:label "Content alert"@en ;
    rdfs:comment "To provide information about a particular type of content potentially sensitive."@en ;
    rdfs:subClassOf <ebu.ch/metadata/ontologies/ebu> .
    ```

    Said something like "Oh, well, that's a class, we can't use that as a property, we'll want to change that."
    Was asked the question "Why can't we use that IRI as a property?"
    The fact that you can't use a resource that is an instance of rdfs:Class as a predicate in an RDF triple -- or, at least, you shouldn't -- seemed self-evident to me. But I found I was somewhat at a loss to come up with what I consider a solid response about why this is the case based in RDF specs.
    Thus, here I am looking for wisdom on the internet.
    To say a bit more...

  19. If you’re trusting your data in Microsoft Fabric to stay accurate just because you set it up perfectly the first time, you could be in for a rude awakening. Data model drift is a silent disruptor—find out what you can do today to prevent tomorrow’s problems.

    Read more 👉 lttr.ai/ArXwo

    #M365ShowPodcast #DataModel #M365Show

  20. Microsoft Fabric Governance Explained: Why Your Data Model Will Drift. If you think frequent versioning, undocumented changes, and growing datasets won’t impact your model, think again—governance is not a ‘nice to have’, it’s a must for data integrity.

    Read more 👉 lttr.ai/ApJ80

    #M365ShowPodcast #DataModel #M365Show

  21. I've been working on data models for #Wikidata type specimen items & structured data for #WikimediaCommons specimen images. This is part of my Wikimedian in Residence & is a collaboration with Brodie Satherley from Auckland Museum.
    See wikidata.org/wiki/Wikidata:Wik
    #NaturalHistory #TypeSpecimen #DataModel #StructuredDataCommons

  22. I've been working on data models for #Wikidata type specimen items & structured data for #WikimediaCommons specimen images. This is part of my Wikimedian in Residence & is a collaboration with Brodie Satherley from Auckland Museum.
    See wikidata.org/wiki/Wikidata:Wik
    #NaturalHistory #TypeSpecimen #DataModel #StructuredDataCommons

  23. I've been working on data models for #Wikidata type specimen items & structured data for #WikimediaCommons specimen images. This is part of my Wikimedian in Residence & is a collaboration with Brodie Satherley from Auckland Museum.
    See wikidata.org/wiki/Wikidata:Wik
    #NaturalHistory #TypeSpecimen #DataModel #StructuredDataCommons

  24. I've been working on data models for #Wikidata type specimen items & structured data for #WikimediaCommons specimen images. This is part of my Wikimedian in Residence & is a collaboration with Brodie Satherley from Auckland Museum.
    See wikidata.org/wiki/Wikidata:Wik
    #NaturalHistory #TypeSpecimen #DataModel #StructuredDataCommons

  25. I've been working on data models for #Wikidata type specimen items & structured data for #WikimediaCommons specimen images. This is part of my Wikimedian in Residence & is a collaboration with Brodie Satherley from Auckland Museum.
    See wikidata.org/wiki/Wikidata:Wik
    #NaturalHistory #TypeSpecimen #DataModel #StructuredDataCommons

  26. Data models don’t stay static in Microsoft Fabric—no matter how careful you are! Dive into the hidden causes of drift and find out how governance can protect your business from the risks lurking beneath your dashboards.

    Read more 👉 lttr.ai/An1ng

    #M365ShowPodcast #DataModel #M365Show

  27. Is your Microsoft Fabric reporting starting to look ‘off’? Here’s why: without proper governance, data models naturally drift—impacting everything from insights to compliance. Swipe through our top reasons and solutions for stopping data chaos before it starts!

    Read more 👉 lttr.ai/An1Nq

    #M365ShowPodcast #DataModel #M365Show

  28. Ever wonder why your Microsoft Fabric data always seems a little off after a while? Data model drift is real—and governs everything from analytics to compliance. Uncover the overlooked factors behind model drift and learn how robust governance can set your data straight.

    Read more 👉 lttr.ai/AnzGz

    #M365ShowPodcast #DataModel #M365Show

  29. #SIEM #security #logs #blue , I would rather threat hunt but here we are. Does it make sense to catalog all log sources and have an example for each one? #knowyourdata right? When is too much documentation too much ? It makes sense to me I guess to catalog all sources than document where the logs would go in a #datamodel and how to query them.

  30. #SIEM #security #logs #blue , I would rather threat hunt but here we are. Does it make sense to catalog all log sources and have an example for each one? #knowyourdata right? When is too much documentation too much ? It makes sense to me I guess to catalog all sources than document where the logs would go in a #datamodel and how to query them.

  31. #SIEM #security #logs #blue , I would rather threat hunt but here we are. Does it make sense to catalog all log sources and have an example for each one? #knowyourdata right? When is too much documentation too much ? It makes sense to me I guess to catalog all sources than document where the logs would go in a #datamodel and how to query them.

  32. Microsoft Fabric Governance Explained: Why Your Data Model Will Drift.

    Read the full article: Microsoft Fabric Governance Explained: Why Your Data Model Will Drift
    lttr.ai/AnN9x

    #M365ShowPodcast #DataModel #M365Show

  33. 🚀 Breaking News: Matt Brown discovers that your destiny is not in the stars, but in your data model! 🌌 Apparently, #startups should prioritize abstract concepts because, clearly, the gravitational pull of "core abstractions" will save them from a black hole of irrelevant features. 🎩✨
    notes.mtb.xyz/p/your-data-mode #BreakingNews #DataModel #CoreAbstractions #Innovation #HackerNews #ngated

  34. 🚀 Breaking News: Matt Brown discovers that your destiny is not in the stars, but in your data model! 🌌 Apparently, #startups should prioritize abstract concepts because, clearly, the gravitational pull of "core abstractions" will save them from a black hole of irrelevant features. 🎩✨
    notes.mtb.xyz/p/your-data-mode #BreakingNews #DataModel #CoreAbstractions #Innovation #HackerNews #ngated

  35. 🚀 Breaking News: Matt Brown discovers that your destiny is not in the stars, but in your data model! 🌌 Apparently, #startups should prioritize abstract concepts because, clearly, the gravitational pull of "core abstractions" will save them from a black hole of irrelevant features. 🎩✨
    notes.mtb.xyz/p/your-data-mode #BreakingNews #DataModel #CoreAbstractions #Innovation #HackerNews #ngated

  36. 🚀 Breaking News: Matt Brown discovers that your destiny is not in the stars, but in your data model! 🌌 Apparently, #startups should prioritize abstract concepts because, clearly, the gravitational pull of "core abstractions" will save them from a black hole of irrelevant features. 🎩✨
    notes.mtb.xyz/p/your-data-mode #BreakingNews #DataModel #CoreAbstractions #Innovation #HackerNews #ngated