How to Use the Student Dimensions
Overview
There are two dimensions in the Core View
Collection that provide lists of
students: StudentSchoolDim
View and
StudentLocalEducationAgencyDim
View.
These dimension provide student names and a few key demographic values with
cardinality of one (e.g., student recorded with a single "sex"). For demographic
information with cardinality "many" (e.g., student record with multiple tribal
affiliations or multiple languages), the Core Collection provides
a DemographicsDim
and two bridge views that link the student dimensions to
the demographic dimension: StudentSchoolDemographicsBridge
View
and StudentLocalEducationAgencyDemo.
This article illustrates the relationships between these views and demonstrates
realistic usage scenarios.
Design Note
Why are there two similar views (StudentSchoolDim
View and
StudentLocalEducationAgencyDim
View),
instead of a single StudentDim
?
- We wanted to include demographic / enrollment information directly in the Student dimension.
- In the Ed-Fi Data Standard v3.x, demographic information can be recorded either on the school relationship or the local education agency (LEA) relationship.
- To create a single view, we would have to coalesce the data, choosing either the school or LEA information as the primary information.
- Which one is primary? It depends on the implementation. → Combining into a single view would oversimplify the necessary complexity in the Ed-Fi ODS database and lead to incorrect results in some implementations.
In short, we decided that it's better to be transparent than to disguise this challenging point.
The sample queries and results below are based on the Glendale sample database. The article provides a few simple examples of what can be done with the views, but not all facets are explored.
Data Model
Enrollment
School Enrollment
"Lander Middle School" has school key 628530001. The following query shows us that there are 320 students enrolled at the school:
select
count(1)
from
analytics.StudentSchoolDim
where
schoolkey = 628530001
Because the Analytics Middle Tier is not a temporal solution, there is no way to ask the question "How many students were enrolled yesterday?" The views are returning data student-school data for right now.
The Analytics Middle Tier could be useful for building a temporal solution — a
true data warehouse. One would need to create an ETL process running every day:
query the StudentSchoolDim
, add a calculated column calling GETDATE()
, and
insert the result into a new table on another database.
Local Education Agency Enrollment
Lander Middle School's LocalEducationAgencyKey is 628530, Lander ISD. Another simple query gives us the current enrollment in this school district:
select
count(1)
from
analytics.StudentLocalEducationAgencyDim
where
StudentLocalEducationAgencyDim.LocalEducationAgencyKey = 628530
The answer is: 320. Apparently Lander ISD only has a middle school, as confirmed by the script below:
select
*
from
analytics.SchoolDim
where
LocalEducationAgencyKey = 628530
Now let's find a better example: What is the enrollment for each school in a district? This time we'll use the Glendale ISD local education agency, with key 867530:
select
LocalEducationAgencyDim.LocalEducationAgencyName,
SchoolDim.SchoolName,
count(1) as Enrollment
from
analytics.LocalEducationAgencyDim
inner join
analytics.SchoolDim
inner join
analytics.StudentSchoolDim
on
SchoolDim.SchoolKey = StudentSchoolDim.SchoolKey
on
LocalEducationAgencyDim.LocalEducationAgencyKey = SchoolDim.LocalEducationAgencyKey
where
LocalEducationAgencyDim.LocalEducationAgencyKey = 867530
group by
LocalEducationAgencyDim.LocalEducationAgencyName,
SchoolDim.SchoolName
This same query without Analytics Middle Tier is not much longer, only requiring one more table join. The foreign keys only require a single column, so they are difficult to get wrong — unlike the complex natural keys on so many other tables.
Expand source
select
edOrgLea.NameOfInstitution as LocalEducationAgencyName,
edOrgSchool.NameOfInstitution as SchoolName,
count(1) as Enrollment
from
edfi.StudentSchoolAssociation
inner join
edfi.School
on
StudentSchoolAssociation.SchoolId = School.SchoolId
inner join
edfi.EducationOrganization edOrgSchool
on
School.SchoolId = edOrgSchool.EducationOrganizationId
inner join
edfi.EducationOrganization edOrgLea
on
School.LocalEducationAgencyId = edOrgLea.EducationOrganizationId
where
edOrgLea.EducationOrganizationId = 867530
group by
edOrgLea.NameOfInstitution,
edOrgSchool.NameOfInstitution
Demographics
School
How do we access student demographics, for example, around language use? The following query gives the count of students by language and school, using the Analytics Middle Tier.
SELECT
SchoolDim.SchoolName AS 'School name',
DemographicDim.DemographicLabel AS 'Language',
COUNT(1) AS 'Number of students'
FROM
analytics.StudentSchoolDim
INNER JOIN
analytics.StudentSchoolDemographicsBridge
ON
StudentSchoolDim.StudentSchoolKey = StudentSchoolDemographicsBridge.StudentSchoolKey
INNER JOIN
analytics.DemographicDim
ON
StudentSchoolDemographicsBridge.DemographicKey = DemographicDim.DemographicKey
INNER JOIN
analytics.SchoolDim
ON
StudentSchoolDim.SchoolKey = SchoolDim.SchoolKey
WHERE
DemographicDim.DemographicParentKey = 'Language'
GROUP BY
SchoolDim.SchoolName,
DemographicDim.DemographicLabel
We can write a similar query without Analytics Middle Tier and it does not
require much more effort. However, that query is different between Data Standard
v2.2 and Data Standard v3.x, because the old edfi.StudentLanguage
table is
now StudentEducationOrganizationAssociationLanguage
. This one query on
Analytics Middle Tier is now portable across Ed-Fi ODS / API versions since
v2.3, without requiring a rewrite.
This same query provides other demographics simply by replacing the word "Language" in the where clause with another demographic key, for example, "TribalAffiliation". You can find all available demographic keys with this query:
Expand source
select
distinct DemographicParentKey
from
analytics.DemographicDim
/*
DemographicParentKey
---------------------
CohortYear
Disability
DisabilityDesignation
Language
LanguageUse
Race
StudentCharacteristic
TribalAffiliation
*/
Local Education Agency
As discussed in the overview of this article, demographics in Data Standard v3.x can be stored either with the student's relationship to the school, or the relationship with the local education agency. The above query can be rewritten for district-level information:
SELECT
LocalEducationAgencyDim.LocalEducationAgencyName,
DemographicDim.DemographicLabel AS 'Language',
COUNT(1) AS 'Number of students'
FROM
analytics.StudentLocalEducationAgencyDim
INNER JOIN
analytics.StudentLocalEducationAgencyDemographicsBridge
ON
StudentLocalEducationAgencyDim.StudentLocalEducationAgencyKey = StudentLocalEducationAgencyDemographicsBridge.StudentLocalEducationAgencyKey
INNER JOIN
analytics.DemographicDim
ON
StudentLocalEducationAgencyDemographicsBridge.DemographicKey = DemographicDim.DemographicKey
INNER JOIN
analytics.LocalEducationAgencyDim
ON
StudentLocalEducationAgencyDim.LocalEducationAgencyKey = LocalEducationAgencyDim.LocalEducationAgencyKey
WHERE
DemographicDim.DemographicParentKey = 'Language'
GROUP BY
LocalEducationAgencyDim.LocalEducationAgencyName,
DemographicDim.DemographicLabel
The query is nearly identical, requiring only two changes:
StudentSchoolDim
→StudentLocalEducationAgencyDim
StudentSchoolDemographicsBridge
→StudentLocalEducationAgencyDemographicsBridge
.
For Data Standard v2.2, the two queries should return the same counts because all of the demographics are stored on the school relationship. But, in Data Standard v3.x, the two queries can produce very different results. Which set of results is appropriate for any given use case depends on how the Student Information System is storing demographic data in the Ed-Fi ODS / API. Data analysts will need to evaluate the results carefully before deciding which data set is the most appropriate for any particular question being explored in the data.